Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于多属性集合的排序列表。Sort()编译错误_Java_Sorting_Collections - Fatal编程技术网

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());