Java列表列表,更好的解决方案?

Java列表列表,更好的解决方案?,java,list,arraylist,multidimensional-array,Java,List,Arraylist,Multidimensional Array,我创建了一个类名objectA,其中包含4个变量: 日期时间;字符串文本;int var1,int var2 我需要创建ObjectA()的列表。然后首先按时间分组,其次按var1分组,然后按var2分组。 这是因为我希望能够比较具有不同var2但具有相同var1的列表;或具有相同var2但不同var1的列表 我最终使用了“List”,我想这很好用,但看起来不太好。我认为这不是一个好的做法。有人知道我可以用什么数据结构、树或其他想法来代替列表中的列表吗 这里实际上也有人问过类似的问题: .但答

我创建了一个类名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;
}