Рекурсия объектов и выравнивание объектов в списке - PullRequest
0 голосов
/ 06 июня 2018

В поисках лучшего решения проблемы рекурсии объекта.Ниже приведен пример:

Класс:

public class SomeObject {
      private List<SomeObject> objects;
}

Данные:

Ввод: SomeObject имеет список объектов икаждый объект в списке имеет тип SomeObject и внутри него есть список.(Рекурсивный по своей природе)

Требование состоит в том, чтобы сгладить их и поместить в один массив.

В сведенном списке должны быть все типы SomeObject.

Кто-нибудь может подсказать, как лучше всего справиться с этим делом.Спасибо!

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Если вы не используете Java 8, вы можете подумать об этом следующим образом.

import java.util.ArrayList;
import java.util.List;

public class TestClass {

    static List<SomeObject> flatList = new ArrayList<SomeObject>();

    public static void flatten(SomeObject object) {
        if (object != null ){
            if( object.getObjects() != null && !object.getObjects().isEmpty()) {
            for (SomeObject o : object.getObjects()) {
               flatten(o);
               flatList.add(object);
            }           
        }
        }
    }

    public static void main(String[] args) {

        SomeObject o1 = new SomeObject("1");

        SomeObject o2 = new SomeObject("2");

        SomeObject o3 = new SomeObject("3");

        SomeObject o4 = new SomeObject("4");

        o1.addObject(o2);
        o2.addObject(o3);
        o3.addObject(o4);

        flatten(o1);
        for (SomeObject obj : flatList){
            System.out.println(obj.getObjectName());
        }


    }

}

 class SomeObject {

     String objectName = "";

     public SomeObject(String name) {
        this.objectName = name;
    }
      private List<SomeObject> objects = new ArrayList<SomeObject>();

    public List<SomeObject> getObjects() {
        return objects;
    }

    public void setObjects(List<SomeObject> objects) {
        this.objects = objects;
    }

    public void addObject(SomeObject o){
        objects.add(o);     
    }

    public String getObjectName() {
        return objectName;
    }
}
0 голосов
/ 06 июня 2018

Чтобы сделать рекурсию, метод для данного объекта должен:

  • добавить себя: добавить в список
  • попросить своих детей сделать то же самое: собрать всех детей getAllChildren()

public class Foo {

    private String s;    
    private List<Foo> fooList = new ArrayList<>();    
    public Foo(String a) {
        s = a;
    }

    public static void main(String[] args) {
        Foo a = new Foo("a");
        Foo b = new Foo("b");
        Foo c = new Foo("c");
        Foo d = new Foo("d");
        Foo e = new Foo("e");
        a.fooList.add(b);
        b.fooList.add(c);
        c.fooList.add(e);
        a.fooList.add(d);
        List<Foo> list = a.getAllChildren();
        System.out.println(list);             
    }

    private List<Foo> getAllChildren() {
        List<Foo> l = fooList.stream().flatMap(elt -> elt.getAllChildren().stream())
                                      .collect(Collectors.toList());
        l.add(this);
        return l;
    }

    @Override
    public String toString() { return s; }
}

Структура ввода:

a-b-c-d
 \   \
  e   f

ВыходСписок:

[d, f, c, b, e, a]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...