Создайте дерево из списка массивов (например, ResultSet) - PullRequest
3 голосов
/ 25 мая 2011

У меня есть список массивов, как этот:

List<String[]> myList = new ArrayList<String[]>();
myList.add( new String[]{"A1","B1","C1","D1","values"} );
myList.add( new String[]{"A1","B1","C2","D1","values"} );
myList.add( new String[]{"A1","B1","C2","D2","values"} );
myList.add( new String[]{"A2","B1","C1","D1","values"} );
myList.add( new String[]{"A2","B1","C1","D2","values"} );

Мне нужно заполнить объект, имеющий зависимости от отцов, поэтому:

  • A1 имеет только одинребенок, B1.
    • B1 имеет 2 детей, C1 и C2.
      • C1 имеет 1 дочерний элемент, D1 со значениями ...
      • C2 имеет 2 дочерних элементов, D1 и D2, которые имеют значения ...
  • A2 имеет только одного ребенка, B1 (не такой, как другой)
    • B1 имеет только одного ребенка, C1 ... и т. Д.

Какую структуру вы считаете лучшей?Мне нужны имена A1, B1 и т. Д.

У меня есть зонд с картами, массивами, списками ... Я думаю, что алгоритм не возможен ... :(: (

Пожалуйста, ПОМОГИТЕ!

Редактировать с объяснением:

У меня есть ResultSet из базы данных с 5 или 6 предложениями GROUP BY. У меня есть все простые данные и

Мне нужносделать структуру с текстовыми объектами, например:

Person A - Building 1 - Tower 1 - Some Text A

Person A - Building 1 - Tower 2 - Another Text

Person A - Building 2 - Tower 1 - Another one Text

Person A - Building 2 - Tower 3 - My Text

Person B - Building 1 - Tower 2 - Any Text

Person B - Building 3 - Tower 1 - A Text...

Мне нужна структура объектов для этих данных ... Возможно ли это?

Ответы [ 3 ]

3 голосов
/ 26 мая 2011

Я ЭТО СДЕЛАЛ! БОЖЕ МОЙ! : D: D: D: D: D: D: D ...

private static void finalFillerTotalSuperSpecial(List<String[]> initialList, HashMap<String,Object> mapa){

     String[] currentElement = null;
     String currentKey = null;

     String[] nextElement = null;
     String nextKey = null;
     int i=0,start,end;

     while (i < initialList.size()) {
     start = i;

     currentElement = initialList.get( i++ );
     currentKey = currentElement[0];

     if (i<initialList.size()){
         nextElement = initialList.get( i );
         nextKey = nextElement[0];
     }

     HashMap<String,Object> insideMap = new HashMap<String,Object>(); 
     mapa.put(currentKey, insideMap);

     while (currentKey.equals(nextKey) && i < initialList.size()) {
         currentElement = initialList.get( i++ );
         currentKey = currentElement[0];

         if (i<initialList.size()){
         nextElement = initialList.get( i );
         nextKey = nextElement[0];
         }

     }
     end = i;

     List<String[]> listOfCurrentElements = new ArrayList<String[]>();
     for (int j=start;j<end;j++)
         listOfCurrentElements.add( getNextArray(initialList.get(j)) );

     if ( listOfCurrentElements.get(0).length>1 )
         finalFillerTotalSuperSpecial(listOfCurrentElements,insideMap);
     else
         insideMap.put(listOfCurrentElements.get(0)[0], null);
     }



 }
2 голосов
/ 25 мая 2011

Конечно, это возможно.:)

Я думаю, что то, что вы описываете, может быть решено с помощью общего или n -ного дерева.Это дерево, в котором каждый узел может иметь любое количество дочерних элементов.Я написал что-то, что делает это в Java.

Если вы не хотите строить дерево, можете собрать, используйте Map<String, Set<String>>.Это на самом деле не дает вам простого доступа к древовидным операциям, но должно поддерживать отношения:

Map<String, Set<String>> myNodes = new LinkedHashMap<String, Set<String>>();
for(String[] myArray : myList) {
   String previousNode = null;
   for(String node : myArray) {
      if(myNodes.get(node) == null) {
         myNodes.put(node, new HashSet<String>());
      }

      if(previousNode != null) {
         myNodes.get(previousNode).add(node);
      }

      previousNode = node;
   }
}

Таким образом, вы по сути получаете (я использую JSON для демонстрации):

{
   A1: ["B1"],
   A2: ["B1"],
   B1: ["C1", "C2"],
   C1: ["D1"],
   C2: ["D1", "D2"],
   D1: ["values"],
   D2: ["values"]
}

Однако это гораздо труднее пройти, чем дерево.

1 голос
/ 25 мая 2011

Итак, вы хотите построить древовидную структуру из этого списка для конкретного представления дерева.

Как и для любой древовидной структуры, ее узлы могут иметь от 0 до n потомков, поэтому потомкиможет быть просто сохранен в List (или, необязательно, Map, если вы хотите быстрый поиск по имени).Для этой задачи сохранение родительской ссылки не представляется необходимым.

Тогда вам просто нужно выполнить итерацию по myList.Для каждого элемента массива

  1. Получите корень существующего дерева.
  2. Итерируйте по массиву.
  3. Для каждой строки в массиве проверьте, является ли текущийУзел дерева имеет дочерний узел с этим именем.
  4. Если нет, создайте его и добавьте в дерево.
  5. Перейдите к дочернему узлу (чтобы он стал текущим узлом).
  6. Возьмите следующую строку из массива и повторите с шага 3.
  7. Возьмите следующий массив из списка и повторите с шага 1.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...