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

时间:2017-04-13 19:46:07

标签: java list arraylist multidimensional-array

我创建了一个类名objectA,它允许说4变量: 约会时间;字符串文字; int var1,int var2

我需要创建一个ObjectA()列表。然后按时间将它们分组,第二个按var1,然后按var2。 这是因为我希望能够比较具有不同var2但相同var1的列表;或列表具有相同的var2但不同的var1。

我最终使用“List< List< List< objectA>>>”哪个工作正常我猜,但它看起来不太好。我不认为这是一个很好的做法。有没有人知道我可以实现的任何数据结构或树或其他想法,而不是列表中列表中的列表。

The list of object may look something like this

这里几乎有类似的问题: List of Lists of Lists 但答案不是我想要的。如果仍然考虑违反规则,请原谅我。

4 个答案:

答案 0 :(得分:2)

这是针对您的问题的简单树结构的示例。

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;
}
}

您可以构建一个简单的树,并在这个简单的结构上运行所有树和图算法。

答案 1 :(得分:1)

通过某个属性对对象进行分组的理想结构是Map List个,其中地图的每个键对应于沿对象列表的属性的每个不同值,以及每个值map是属性与键匹配的所有对象的子列表。

让我们开始按单个属性进行分组。使用流很容易实现你想要的:

Map<Date, List<ObjectA>> groupsByDate = 
    yourList.stream()
        .collect(Collectors.groupingBy(ObjectA::getTime));

这假定ObjectA具有getTime方法。

现在,Collectors.groupingBy有一个重载版本,它接受所谓的下游收集器,这意味着您可以将与值匹配的对象收集到不同于List的另一个结构中。

例如,您可以收集到按第二个条件对对象进行分组的第二个Map,在您的情况下,这将是var1

Map<Date, Map<String, List<ObjectA>>> groupsByDateAndVar1 = 
    yourList.stream()
        .collect(Collectors.groupingBy(
            ObjectA::getTime, 
            Collectors.groupingBy(ObjectA::getVar1)));

这假定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))));

这假定ObjectA也有getVar2方法。

答案 2 :(得分:0)

如果您希望按第一个变量分组,然后按第二个子组分组,那么List<List<Object>>可能是您想要的

你也可以做一棵树,直到你

答案 3 :(得分:0)

如果这总是你想要排序的方式;按时间,然后val1,然后val2,在ObjectA类中实现Comparable。像

这样的东西
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;
}

然后只排序()一个列表。