我有一个对象。
public class Test{
int age;
LocalDateTime currentTime;
//class also contains getters and setters.
}
假设我有一个List,我需要计算平均年龄。我迭代所有,添加值然后除以列表的大小。现在我需要计算年龄和平均值之间的差异。如果年龄和平均重复之间的差异(在列表中的不同对象之间是相同的)那么我需要从数组中删除具有最早时间戳的对象。
我被困在如何做到这一点。最初我认为我可以扩展Test类来存储差异然后进行排序,但是想要避免这种情况。剩下的其他选项是将它存储在Map中或为它们创建一个单独的对象,但看起来非常混乱。
关于如何做到这一点的任何其他想法?
答案 0 :(得分:0)
当且仅当年龄相同时,两个对象具有相同(平均年龄)。所以,您可以通过(年龄,[从最新到最早的时间戳]对列表进行排序)(这可以通过比较器完成)并从第二个元素开始迭代数组,如果它具有相同的年龄,则删除每个元素就像前一个一样。
[编辑:除非你考虑平均值和年龄之间差异的绝对值?如果是,请澄清]。
实际上,如果你的意思是差异的绝对值,它并没有太大的区别。创建一个比较器,按(abs(平均年龄),[最新到最早的时间戳])对数组进行排序,算法仍然适用。如果需要,请参阅:How to use Comparator in Java to sort。
答案 1 :(得分:0)
这里你不需要移除算法中的均值
然后尝试使用两个for循环
for(int i=0; i<list.size();++i){
Test currentTest = list.get(i);
List<Test> toRemove = new LinkedList<>();
for(int j=i+1;j<list.size();++j){
Test test = list.get(j);
if(currentTest.age == test.age){
if(currentTest.currentTime.after(test.currentTime){
toRemove.add(currentTest);
currentTest = test;
} else {
toRemove.add(test);
}
}
}
list.removeAll(toRemove);
}
或者您可以首先按时间排序列表(从早期到早期,迭代列表并删除元素,如果年龄相同且在当前元素之后)。或者使用带有年龄密钥的treemap,遍历列表,检查元素是否在树中,如果不是,则添加else compare currentTime并在需要时替换。然后将所有值设置为。
请记住,如果你需要卑鄙,你必须在从列表中删除任何元素之前对其进行计数。