Выровнять вложенный объект N-уровня в Java - PullRequest
1 голос
/ 18 марта 2019

У меня есть класс Java

class Example{
   String field1;
   String field2;
   List<Example> subExamples;    
}

В вышеприведенном сценарии у Example есть subExamples, который снова является списком примеров. Это вложение может быть n-уровней. Чего я хочу добиться, так это иметь список примеров, то есть выровнять вышеупомянутый объект и собрать все примеры в окончательный список (собрав все n-уровневые примеры). Одним из очевидных способов является рекурсия. Есть ли способ в Java, я могу добиться этого более эффективно. Я попробовал некоторые концепции Java 8, но они не соответствуют требованию.

Ответы [ 3 ]

1 голос
/ 18 марта 2019

Простой метод, который вы можете использовать:

static Stream<Example> flatten(Example ex) {
    if (ex.getSubExamples() == null || ex.getSubExamples().isEmpty()) {
        return Stream.of(ex);
    }

    return Stream.concat(Stream.of(ex), 
                ex.getSubExamples().stream().flatMap(Main::flatten));
}

Который вы можете использовать как

List<Example> flattened = examples.stream()
        .flatMap(Main::flatten) //change class name
        .collect(Collectors.toList());
1 голос
/ 18 марта 2019

Это можно сделать нерекурсивно:

private Collection<Example> flatten(Example example) {
  Queue<Example> work = new ArrayDeque<>();
  if (example != null) {
    work.offer(example);
  }
  Collection<Example> flattened = new ArrayList<>();
  while(!work.isEmpty()) {
    Example cur = work.poll();
    flattened.add(cur);
    cur.subExamples.forEach(work::offer);
  }
  return flattened;
}
1 голос
/ 18 марта 2019

Например:

private static Stream<Example> flat(Example example) {
    return Stream.concat(Stream.of(example),
                         example.getSubExamples().stream().flatMap(Sandbox::flat));
}

, где Sandbox - это класс, в котором определен метод flat.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...