包含两种不同类型数据类型java的数据结构

时间:2014-04-25 07:30:53

标签: java list abstract-data-type

我有一个对象。

public class Test{

int age;
LocalDateTime currentTime;

//class also contains getters and setters. 

}

假设我有一个List,我需要计算平均年龄。我迭代所有,添加值然后除以列表的大小。现在我需要计算年龄和平均值之间的差异。如果年龄和平均重复之间的差异(在列表中的不同对象之间是相同的)那么我需要从数组中删除具有最早时间戳的对象。

我被困在如何做到这一点。最初我认为我可以扩展Test类来存储差异然后进行排序,但是想要避免这种情况。剩下的其他选项是将它存储在Map中或为它们创建一个单独的对象,但看起来非常混乱。

关于如何做到这一点的任何其他想法?

2 个答案:

答案 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并在需要时替换。然后将所有值设置为。

请记住,如果你需要卑鄙,你必须在从列表中删除任何元素之前对其进行计数。