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;来发生。
我有什么想法可以做到吗?
答案 0 :(得分:1)
使用TreeSet
或HashSet
数据结构,根据定义,这些结构不允许重复元素,但您需要执行的操作还包括实现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