【问题标题】:Sort List based on multiple properties Collection.sort() Compile error根据多个属性对列表进行排序 Collection.sort() 编译错误
【发布时间】:2016-09-23 09:28:44
【问题描述】:

我需要使用多个属性对列表进行排序,我尝试了此代码,但出现编译错误

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

说错了,

绑定不匹配:Collections 类型的泛型方法 sort(List) 不适用于参数 (List)。推断的类型 Kot 不是有界参数的有效替代品>

我做错了什么?

【问题讨论】:

    标签: java sorting collections


    【解决方案1】:

    您需要为此实现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());
    

    【讨论】:

      【解决方案2】:

      您将Kot 设为Comparator of Kots。但是,sort() 方法期望 KotComparable 到其他 Kots:

      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】:

        我假设你需要排序

        • 首先是kotNo
        • 然后用productName

        其实这个Comparable 是一个古老的东西。使用 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());
        

        【讨论】:

          猜你喜欢
          • 2011-05-17
          • 1970-01-01
          • 2021-06-27
          • 2011-05-13
          • 1970-01-01
          • 2012-11-14
          相关资源
          最近更新 更多