Java列表列表,更好的解决方案?
我创建了一个类名objectA,其中包含4个变量: 日期时间;字符串文本;int var1,int var2 我需要创建ObjectA()的列表。然后首先按时间分组,其次按var1分组,然后按var2分组。 这是因为我希望能够比较具有不同var2但具有相同var1的列表;或具有相同var2但不同var1的列表 我最终使用了“ListJava列表列表,更好的解决方案?,java,list,arraylist,multidimensional-array,Java,List,Arraylist,Multidimensional Array,我创建了一个类名objectA,其中包含4个变量: 日期时间;字符串文本;int var1,int var2 我需要创建ObjectA()的列表。然后首先按时间分组,其次按var1分组,然后按var2分组。 这是因为我希望能够比较具有不同var2但具有相同var1的列表;或具有相同var2但不同var1的列表 我最终使用了“List”,我想这很好用,但看起来不太好。我认为这不是一个好的做法。有人知道我可以用什么数据结构、树或其他想法来代替列表中的列表吗 这里实际上也有人问过类似的问题: .但答
- >”,我想这很好用,但看起来不太好。我认为这不是一个好的做法。有人知道我可以用什么数据结构、树或其他想法来代替列表中的列表吗
这里实际上也有人问过类似的问题:
.但答案不是我想要的。请原谅,如果这仍然是违反规则的。 < P>这是一个简单的树结构的例子来解决你的问题。
public class Tree {
private Node root;
public Tree(List<YourObject> rootData) {
root = new Node();
root.data = rootData;
root.children = new ArrayList<Node>();
}
public static class Node {
private List<YourObject> data;
private Node parent;
private List<Node> children;
}
}
公共类树{
私有节点根;
公共树(列表根数据){
根=新节点();
root.data=rootData;
root.children=new ArrayList();
}
公共静态类节点{
私人名单数据;
私有节点父节点;
私人名单儿童;
}
}
您可以构建一个简单的树,并在这个简单的结构上运行所有树和图算法。如果您想按第一个变量分组,然后按第二个变量分组,则可能需要一个列表
您也可以创建一个树,由您自己决定。根据某个属性对对象进行分组的理想结构是一个列表的映射
,其中映射的每个键对应于对象列表中属性的每个不同值,映射的每个值都是属性与键匹配的所有对象的子列表
让我们从单个属性开始分组。使用streams很容易实现您的目标:
Map<Date, List<ObjectA>> groupsByDate =
yourList.stream()
.collect(Collectors.groupingBy(ObjectA::getTime));
这假设ObjectA
还有一个getVar1
方法
最后,如果需要按照第三个嵌套条件进行分组,可以采用类似的方式:
Map<Date, Map<String, Map<String, List<ObjectA>>>> groupsByDateAndVar1AndVar2 =
yourList.stream()
.collect(Collectors.groupingBy(
ObjectA::getTime,
Collectors.groupingBy(
ObjectA::getVar1,
Collectors.groupingBy(ObjectA::getVar2))));
映射组ByDateAndVar1和Var2=
yourList.stream()
.collect(收集器.groupingBy(
ObjectA::getTime,
收集者分组(
ObjectA::getVar1,
Collectors.groupby(ObjectA::getVar2));
这假设ObjectA
也有一个getVar2
方法。如果您总是希望这样排序;在ObjectA类中,依次是val1和val2。差不多
public int compareTo(Object that) {
//check for null
// check for instanceOf ObjectA
// cast from Object to ObjectA
int result = this.time.compareTo(that.time);
if (result == 0) {
// time comparison was the same
result = this.var1.compareTo(that.var1);
if (result == 0) {
// time and var1 comparisons were the same
result = this.var2.compareTo(that.var2)
}
}
return result;
}
然后只排序()一个列表。为什么您需要列表
?您的图片清楚地显示了树,树中的每个节点都是列表请更具体一些。您的图像看起来像一个树结构。你为什么不用它们?写下你自己的数据结构图片只是为了说明列表是如何分组的。顶部显示了对象的整个列表。在第二行,对象列表由var1分隔,在第三行,对象列表由var2分隔。我可以做这样的结构,但我会有重复的对象(在这种情况下,每个对象重复3次)我已经改变图片,以更好地说明我的意思。对不起,对象是第一次按时间排序。我已经编辑了这个问题。我曾想过使用地图,但避免使用“地图中的地图中的地图”。除非这真的比“列表中的列表中的列表”好。@udon它更好,因为您可以通过属性值访问每个子映射,而对于列表,您必须按索引访问。也许你可以用这个,我明白了。不过番石榴桌看起来很有前景。谢谢:)@udon如果您想按三个变量分组,恐怕您必须分组到列表表映射(或列表映射表,无论您认为更好)
public int compareTo(Object that) {
//check for null
// check for instanceOf ObjectA
// cast from Object to ObjectA
int result = this.time.compareTo(that.time);
if (result == 0) {
// time comparison was the same
result = this.var1.compareTo(that.var1);
if (result == 0) {
// time and var1 comparisons were the same
result = this.var2.compareTo(that.var2)
}
}
return result;
}