列表上的高级排序

时间:2018-02-07 19:26:38

标签: java list sorting

arrayForm类型如下:

private LocalDate date;
private Integer number;
private String name;
private Object object;

代码如下:

ArrayList<ArrayForm> listArray = new ArrayList<>();
listArray.add(new ArrayForm(LocalDate.of(2018, 1, 12), 50, "First name", object));
listArray.add(new ArrayForm(LocalDate.of(2018, 1, 10), 50, "Second name", object));
listArray.add(new ArrayForm(LocalDate.of(2018, 1, 10), 50, "Third name", object));
listArray.add(new ArrayForm(LocalDate.of(2018, 1, 11), 50, "Fourth name", object));

我尝试做的是分几步对这个数组进行排序。

首先按日期排序,我在下面找到了解决方案(我不确定它是否是最佳解决方案,但它确实有效。)

listArray.sort(Comparator.comparing(o -> o.getDate()));

第二个,如果日期和对象相同,则将它们合并为一个元素。

预期结果:

2018-1-10, 100, "Second name", object
2018-1-11, 50, "Fourth name", object  
2018-1-12, 50, "First name", object

PS。如果String保持不变并不重要: &#34;第二名&#34;,或&#34;第三名&#34;,或将通过附加&#34;第二名称第三名&#34;来发生。

我有什么想法可以做到吗?

2 个答案:

答案 0 :(得分:1)

使用TreeSetHashSet数据结构,根据定义,这些结构不允许重复元素,但您需要执行的操作还包括实现equals()hashCode()方法这会覆盖他们的默认行为。

以下是一个工作示例:https://pastebin.com/swazGxRc。它演示了这两种数据结构的使用,但在您的情况下,因为您需要对元素进行排序,所以首选TreeSet是首选,因为它始终对元素进行排序,这与我的方式不同通过传递Comparator来解决此问题,您可以实现接口Comparable<T>以获得相同的行为,如果您要重复使用代码(也就是多次排序),这也是首选选项)。

答案 1 :(得分:1)

这假定object方法的equals相等是由==方法完成的,而不仅仅是Collection<ArrayForm> result = listArray.stream() .sorted( Comparator.comparing(ArrayForm::getDate) ) .collect( Collectors.toMap( (a) -> new AbstractMap.SimpleEntry<>( a.getObject(), a.getDate() ), a -> a, (a1, a2) -> { a1.setNumber( a1.getNumber() + a2.getNumber() ); return a1;} ) ).values(); 相同的实例检查。

List1.SetEquals(List2); //returns true if the collections contains exactly same elements no matter the order they appear in the collection