使用类更好地抽象逻辑?或者只是ArrayList?

时间:2013-04-30 10:49:00

标签: java list arraylist

目前我正在制作列表清单。我偶然发现了这个问题(我的意思是,选择了答案)。 List of Lists of Lists

@Mario Fusco指出有更好的类和对象抽象。老实说,我不知道用例是否适用于所有场景。例如,我有一个列表(列表):

[[2, 5, 6, 7], [8, 10, 12, 13, 15], [6, 13, 23, 25, 30, 34], [16, 25], [5, 16, 25, 30], [6, 25, 30], [1, 5, 9, 13, 14], [14, 25], [2, 6, 12, 34], [2, 5, 25], [2, 3, 31], [1, 16, 19], [2, 34], [3, 6], [8, 10, 12, 13, 15], [5, 10], [1, 8, 14], [3, 5], [1, 2, 8, 9, 13, 15], [3, 6, 13], [8, 15], [25, 34], [25, 31], [5, 23], [30, 31], [8, 10, 12, 13, 15], [30, 34], [8, 10, 12, 13, 15], [25, 31], [25, 31], [5, 23, 34], [3, 5, 8, 10, 12, 13, 15], [2, 8, 9, 12, 13, 15], [2, 15]]
/* I created it using ArrayList<ArrayList<Integer>> and few previous processing. 

我需要对其进行简单的处理,例如2,5等的计数,在列表(列表)中找到重复的集合等等。为内部列表创建一个类是否聪明,然后将这些对象添加到列表中(每个对象包含这些数字的ArrayList)。我对目前可用的选项感到困惑,需要弄清楚哪种方式应该更好。如果你能解释一些例子,用例,我会感到不知所措。

编辑:  我是从Python背景和非常友好的播放列表和列表列表等。但是在大型数据集上工作有点问题(没有攻击意图,有很好的东西,如Cython,但它只是为了要求),因此转移到Java部分问题。

我可以改变问题的方向,并询问哪种方法更适合内存管理和CPU透视?子列表的数量可能增长到近50万到每百万,每个包含2-10个数字。

5 个答案:

答案 0 :(得分:2)

  

我需要对其进行简单处理,例如计数出现等,等等,在列表(列表)中查找重复集等等。

如果您只是对一个数字列表进行简单处理,并且这些数字并不真正代表其他任何内容,那么您的设置就可以了 - 没有必要为了这个目的而不必要地添加类它的。

你所链接的答案指的是这样一个事实:在大多数现实世界的情况下,嵌入的数字列表通常代表你的OO模型中的某种对象,而不仅仅是一个数字列表在其本身。如果是这种情况,那么如果创建一个新类来更明确地描述这个&#34;内部列表&#34;那么读取代码的人会更清楚。实际上代表着。

答案 1 :(得分:1)

  

我需要对其进行简单处理,例如计数出现为2,5   等,在列表(列表)中找到重复的集,依此类推。那将会   智能创建内部列表的类,然后添加它们   要列出的对象(每个对象包含这些数字的ArrayList)

似乎您只需对数据执行简单操作即可。在这种情况下,您最好使用列表清单列表。因为它使您的代码足够简单,易于操作,易于维护和高效。因为,您希望您的算法有效并且可能避免不必要的复杂性。

  

@Mario Fusco指出有更好的类和抽象抽象   对象。

通常,如果使用list of list of list对业务对象进行建模,则不推荐使用,因为@Mario Fusco正确指出,它将导致维护方案和可读性问题。在建模业务对象时,您应该更喜欢使用域行话。

答案 2 :(得分:0)

我建议你去面向对象并创建一个自定义对象列表,它在内部创建一个整数列表。这样您就可以覆盖equals and hashcode并编写您可能想要的任何其他方法。

public class CustomObject { 

    List<Integer> intlist;

    public List<Integer> getIntlist() {
        return intlist;
    }

    public void setIntlist(List<Integer> intlist) {
        this.intlist = intlist;
    }

    @Override
    public int hashCode() {
        //code here
    }

    @Override
    public boolean equals(Object obj) {
        //code here
    }

}

可以在这里编写方法来检查整数计数,而equals可以比较两个对象并找到重复项

答案 3 :(得分:0)

ArrayList你不会发现任何便利/情报,这就是Mario Fusco的观点所在。你会发现自己编写了大量的代码,如果没有适当的类来编写代码,它就会在你的主类中浮动。您将把遍布此处的列表列表传递给可能是该对象的实例方法的方法。

不要与Java对课程的热爱作斗争。 Java将永远胜利。

答案 4 :(得分:0)

你可以很好地使用ArrayList&gt;为了你提到的目的。您的用例没有任何表示类的内容。

现在,如果这些数字是学生ID,则内部列表代表一个班级单位。然后你可以设计如下。

public class Unit {

  private List<Interger> studentIds;

  // Rest of code as getter setter etc.
}

并说外部名单代表一所学校。

public class School {

  private List<Unit> units;

  // Rest of the code as getter setter etc.
}