有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

基于多属性集合的java排序列表。sort()编译错误

我需要使用多个属性对列表进行排序,我尝试了这段代码,但遇到了编译错误

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;
    }
}

在下一行中显示错误

Collections.sort(kots);

错误地说

绑定不匹配:类型集合的泛型方法排序(列表)不适用于参数(列表)。推断类型Kot不是有界参数的有效替代品>

我做错了什么


共 (3) 个答案

  1. # 1 楼答案

    我想你需要分类

    • 首先是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());
    
  2. # 2 楼答案

    您使您的Kot成为KotComparator。但是,sort()方法期望Kot成为Comparable其他KotKot

    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
            ...
        }
    }
    

    您还可以将类拆分为KotKotComparator,将比较器逻辑移动到KotComparator,并使用sort()重载,该重载使用自定义比较器进行排序

  3. # 3 楼答案

    您需要为此实现Comparable接口。 例如:

    class Kot implements Comparable<Kot> {
    
        private String productName;
        private Integer kotNo;
    
        public Kot() {
        }
    
        public Kot(String productName, Integer kotNo) {
            this.productName = productName;
            this.kotNo = kotNo;
        }
    
        @Override
        public int compareTo(Kot kot1) {
            int kotNoCompare = kot1.kotNo.compareTo(this.kotNo);
            if (kotNoCompare == 0) {
                int productNameCompare = kot1.productName.compareTo(this.productName);
                return productNameCompare;
            }
            return kotNoCompare;
        }
    }
    

    如果只想使用Comparator,那么必须将该比较逻辑移动到单独的类中Kot仍然是一个简单的POJO类,只包含getter和setter

    例如Comparataor纯逻辑:

    class Comp implements Comparator<Kot>{
         @Override
            public int compare(Kot kot1, Kot kot2) {
                int kotNoCompare = kot1.getKotNo().compareTo(kot2.getKotNo());
                if (kotNoCompare == 0) {
                    int productNameCompare = kot1.getProductName().compareTo(kot2.getProductName());
                    return productNameCompare;
                }
                return kotNoCompare;
            }
    }
    

    现在,要对列表进行排序,可以使用其他排序方法:

    Collections.sort(kots, new Comp());