Java 基于多属性集合的排序列表。Sort()编译错误
我需要使用多个属性对列表进行排序,我尝试了这段代码,但遇到了编译错误Java 基于多属性集合的排序列表。Sort()编译错误,java,sorting,collections,Java,Sorting,Collections,我需要使用多个属性对列表进行排序,我尝试了这段代码,但遇到了编译错误 package com.demo; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import lombok.Data; import lombok.extern.log4j.Log4j; @Log4j public class TestSort {
package com.demo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import lombok.Data;
import lombok.extern.log4j.Log4j;
@Log4j
public class TestSort {
public static void main(String[] args) {
List<Kot> kots = new ArrayList<Kot>(){{
add(new Kot("aa",1));
add(new Kot("vv",1));
add(new Kot("zz",2));
add(new Kot("bb",3));
add(new Kot("cc",1));
}};
log.info(kots);
Collections.sort(kots);
log.info(kots);
}
}
@Data
class Kot implements Comparator<Kot> {
private String productName;
private Integer kotNo;
public Kot(){}
public Kot(String productName,Integer kotNo){
this.productName = productName;
this.kotNo = kotNo;
}
@Override
public int compare(Kot kot1, Kot kot2) {
int kotNoCompare = kot1.kotNo.compareTo(kot2.kotNo);
if (kotNoCompare == 0) {
int productNameCompare = kot1.productName.compareTo(kot2.productName);
return productNameCompare;
}
return kotNoCompare;
}
}
package.com.demo;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.Comparator;
导入java.util.List;
导入龙目数据;
导入lombok.extern.log4j.log4j;
@Log4j
公共类TestSort{
公共静态void main(字符串[]args){
List kots=new ArrayList(){{
添加(新Kot(“aa”,1));
增加(新Kot(“vv”,1));
增加(新Kot(“zz”,2));
添加(新Kot(“bb”,3));
增加(新Kot(“cc”,1));
}};
日志信息(kots);
集合。排序(kots);
日志信息(kots);
}
}
@资料
类Kot实现了比较器{
私有字符串产品名称;
私有整数kotNo;
公共Kot(){}
公共Kot(字符串产品名、整数kotNo){
this.productName=productName;
this.kotNo=kotNo;
}
@凌驾
公共整数比较(Kot kot1、Kot kot2){
int-kotNoCompare=kot1.kotNo.compareTo(kot2.kotNo);
如果(kotNoCompare==0){
int-productNameCompare=kot1.productName.compareTo(kot2.productName);
返回和比较;
}
返回kotNoCompare;
}
}
在下一行中显示错误
Collections.sort(kots)代码>
错误地说
绑定不匹配:类型集合的泛型方法排序(列表)不适用于参数(列表)。推断类型Kot不是有界参数的有效替代品>
我做错了什么 您使您的Kot
成为Kot
s的Comparator
。然而,sort()
方法期望Kot
与其他Kot
相比较:
class Kot implements Comparable<Kot> {
...
public int compareTo(Kot otherKot) {
// Comparison logic needs to be transformed
// to compare otherKot to this, rather than kot1 to kot2
...
}
}
类Kot实现了可比较的{
...
公共int比较(Kot其他Kot){
//比较逻辑需要转变
//将其他KOT与此进行比较,而不是将kot1与kot2进行比较
...
}
}
您还可以将类拆分为Kot
和KotComparator
,将比较器逻辑移动到KotComparator
,并使用sort()
重载,该重载使用自定义比较器进行排序。为此需要实现compariable
接口。
例如:
现在,要对列表进行排序,可以使用其他排序方法:
Collections.sort(kots, new Comp());
我想你需要分类
- 首先使用
kotNo
- 然后使用
productName
事实上,这是一件古老的事情。使用Java 8,您只需要一行代码
List<Kot> kots = new ArrayList<Kot>(){{
add(new Kot("aa",1));
add(new Kot("vv",1));
add(new Kot("zz",2));
add(new Kot("bb",3));
add(new Kot("cc",1));
}};
kots = kots.stream().sorted(
comparing(Kot::getKotNo)
.thenComparing(comparing(Kot::getProductName)))
.collect(toList());
List kots=new ArrayList(){{
添加(新Kot(“aa”,1));
增加(新Kot(“vv”,1));
增加(新Kot(“zz”,2));
添加(新Kot(“bb”,3));
增加(新Kot(“cc”,1));
}};
kots=kots.stream().sorted(
比较(Kot::getKotNo)
.thenComparing(比较(Kot::getProductName)))
.collect(toList());
Collections.sort(kots, new Comp());
List<Kot> kots = new ArrayList<Kot>(){{
add(new Kot("aa",1));
add(new Kot("vv",1));
add(new Kot("zz",2));
add(new Kot("bb",3));
add(new Kot("cc",1));
}};
kots = kots.stream().sorted(
comparing(Kot::getKotNo)
.thenComparing(comparing(Kot::getProductName)))
.collect(toList());