Вы можете создать Map
каждого Row
, проиндексированного по его имени:
Map<String,Row> nodes = list.stream().collect(Collectors.toMap(Row::getName,Function.identity()));
getName()
- второе свойство, переданное конструктору Row
.
Теперь вы можете использовать это Map
для построения дерева:
Map<Row,List<Row>> tree = list.stream().collect(Collectors.groupingBy(r->nodes.get(r.getParent())));
getParent()
- первое свойство, переданное конструктору Row
.
Это потребует от класса Row
правильного переопределения equals
и hashCode
, поэтому два экземпляра Row
будут считаться равными, если они имеют одинаковое имя.
Вы, вероятно, должны добавить корень Row
к вашему вводу List
. Что-то вроде:
list.add(new Row(null, "-", "Root"));
EDIT:
Я протестировал его с полным Row
классом (хотя я сделал несколько ярлыков), включая пример обхода дерева от корня по первому потомку каждого уровня:
class Row {
String name;
String parent;
Row (String parent,String name,String something) {
this.parent = parent;
this.name = name;
}
public String getParent () {return parent;}
public String getName () {return name;}
public int hashCode () {return name.hashCode ();}
public boolean equals (Object other) {
return ((Row) other).name.equals (name);
}
public String toString ()
{
return name;
}
public static void main (String[] args)
{
List<Row> list = new ArrayList<>();
list.add(new Row(null, "-", "Root"));
list.add(new Row("-", "A", "Root"));
list.add(new Row("A", "A1", "Alpha 1"));
list.add(new Row("A1", "A11", "Alpha 11"));
list.add(new Row("A", "A2", "Alpha 2"));
list.add(new Row("-", "B", "Root"));
list.add(new Row("B", "B1", "Bravo 1"));
list.add(new Row("B", "B2", "Bravo 2"));
Map<String,Row> nodes =
list.stream()
.collect(Collectors.toMap(Row::getName,Function.identity()));
Map<Row,List<Row>> tree =
list.stream()
.filter(r->r.getParent()!= null)
.collect(Collectors.groupingBy(r->nodes.get(r.getParent())));
System.out.println (tree);
Row root = nodes.get ("-");
while (root != null) {
System.out.print (root + " -> ");
List<Row> children = tree.get (root);
if (children != null && !children.isEmpty ()) {
root = children.get (0);
} else {
root = null;
}
}
System.out.println ();
}
}
Выход:
Дерево:
{A1=[A11], A=[A1, A2], B=[B1, B2], -=[A, B]}
Обход:
- -> A -> A1 -> A11 ->