1

目前我正在处理列表列表。我偶然发现了这个问题(我的意思是,选定的答案)。列表列表列表

@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 视角?子列表的数量可能会增长到近百万到百万,每个包含 2-10 个数字。

4

5 回答 5

2

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

如果您只是对数字列表进行简单处理,而这些数字并不真正代表其他任何东西,那么您的设置就很好 - 没有必要仅仅为了它而不必要地添加类。

您链接到的答案是指在大多数像这样的实际情况下,嵌入的数字列表通常表示您的 OO 模型中的某种对象,而不仅仅是一个数字列表本身。如果是这种情况,那么阅读代码的人会更清楚,如果创建一个新类来更明确地描述这个“内部列表”实际代表什么。

于 2013-04-30T10:54:45.193 回答
1

而且我需要对其进行简单的处理,例如计数 2,5 等,在列表(列表)中查找重复集等等。为内部列表创建一个类然后将这些对象添加到列表中(每个对象包含这些数字的 ArrayList)是否会很聪明

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

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

通常,如果您使用 对业务对象进行建模list of list of list,则不建议这样做,因为@Mario Fusco 正确指出,这将导致维护场景和可读性问题。在对业务对象建模时,您应该更喜欢使用领域术语。

于 2013-04-30T10:56:56.517 回答
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 可以比较两个对象并找到重复项

于 2013-04-30T10:55:15.450 回答
0

您将在 中找不到任何便利/智能ArrayList,这就是 Mario Fusco 的观点成立的原因。您会发现自己编写了大量的代码,并且没有适当的类来放入该代码,它只会在您的主类中浮动。您将到处传递您的列表列表到可能是该对象的实例方法的方法。

不要与 Java 对类的热爱作斗争。Java 将永远赢。

于 2013-04-30T11:00:40.003 回答
0

您可以很好地将 ArrayList> 用于您提到的目的。您的用例没有任何表示类的内容。

现在,如果这些数字是学生 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.
}
于 2013-04-30T11:01:34.733 回答