【问题标题】:sort list of object on java 8 with custom criteria [duplicate]使用自定义标准对java 8上的对象列表进行排序[重复]
【发布时间】:2019-10-09 21:20:41
【问题描述】:

我有MyObject的列表

List<MyObject> myObjects;

MyObject 是一个类似于下面的模型类

public class MyObject{

private String fName;
private String lname;
private String code;

//getter setter

}

代码有四种可能的值,比如ABC,DEF,XYZ and PQR

现在我想根据以下标准对列表进行排序。所有代码值为XYZ 的对象都应在前,然后是PQRABCDEF

  1. XYZ
  2. PQR
  3. ABC
  4. DEF

如果可能,我想使用 java 8 来实现这一点。如何对我的 ArrayList 进行排序。

【问题讨论】:

  • 使用自定义ComparatorHow to sort List of objects by some property 将是一个很好的起点
  • 我想出了那个部分,但没有实现它的工作。
  • myObjects.sort((o1, o2) -&gt; { if(o1.getCode().equals("XYZ")) return -1; else if(o2.getCode().equals("XYZ")) return 1; // &lt;do the same for all codes in the order you want&gt; else return o1.getCode().compareTo(o2.getCode()); });
  • 请记住,您正在比较两个对象的键以及它们之间的关系
  • 为每个代码分配一个数值:XYZ -> 1, PQR -> 2, ABC -> 3, DEF -> 4. 获取 o1 的数值,以及 o2 的数值。比较数值。

标签: java java-8 comparator


【解决方案1】:

如果您的代码变量只有四个可能的值,您可以将它们保存在地图中,并在对列表进行排序时比较这些值:

public static void main(String[] args) {             
    List<MyObject> myObjects = new ArrayList<>();
    myObjects.add(new MyObject("fName1", "lname1", "ABC"));
    myObjects.add(new MyObject("fName2", "lname2", "PQR"));
    myObjects.add(new MyObject("fName3", "lname3", "XYZ"));
    myObjects.add(new MyObject("fName4", "lname4", "DEF"));

    Map<String,Integer> map = new HashMap<>();
    map.put("XYZ", 1);
    map.put("PQR", 2);
    map.put("ABC", 3);
    map.put("DEF", 4);

    Comparator<MyObject> sortByCode = (obj1,obj2)->Integer.compare(map.get(obj1.code), map.get(obj2.code));
    System.out.println("Before sorting");
    System.out.println(myObjects);

    System.out.println("After sorting");
    myObjects.sort(sortByCode);
    System.out.println(myObjects);
}

【讨论】:

  • 可以在原始列表上完成而不创建另一个列表吗?
  • @user9735824 我已经更新了我的代码,以便在不创建新列表的情况下对您的原始列表进行排序。
【解决方案2】:

您需要创建自己的 Comparator 以根据您的逻辑比较 MyObject 的实例:

Comparator<MyObject> cmp = (o1, o2) ->{
    //Implement comparison logic here
    //Compare o1 and o2 and return -1,0, or 1 depending on your logic
};

然后给出一个这样的列表:

List<MyObject> listToSort = ...

您可以使用旧的Collections.sort() 函数对其进行就地排序:

Collections.sort(listToSort, cmp);

或者,如果您愿意,可以使用 Java 8 流:

listToSort.stream().sorted(cmp).collect(Collectors.toList()); //Using streams

【讨论】:

  • 感谢您的回答,但我遇到的主要问题实际上是实现比较逻辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 2020-01-10
  • 2014-12-26
  • 2016-02-02
  • 1970-01-01
相关资源
最近更新 更多