我创建了一个类名objectA,它允许说4变量: 约会时间;字符串文字; int var1,int var2
我需要创建一个ObjectA()列表。然后按时间将它们分组,第二个按var1,然后按var2。 这是因为我希望能够比较具有不同var2但相同var1的列表;或列表具有相同的var2但不同的var1。
我最终使用“List< List< List< objectA>>>”哪个工作正常我猜,但它看起来不太好。我不认为这是一个很好的做法。有没有人知道我可以实现的任何数据结构或树或其他想法,而不是列表中列表中的列表。
这里几乎有类似的问题: List of Lists of Lists 但答案不是我想要的。如果仍然考虑违反规则,请原谅我。
答案 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;
}
然后只排序()一个列表。