Страницы

Поиск по вопросам

пятница, 10 января 2020 г.

Как вложить класс в метод?

#java


Есть кусок кода на java

final List advertisements = new ArrayList<>();
new Object() {
    public void recurse(int i) {
        advertisements.add(storage.list().get(i));
        if (i + 1 < storage.list().size())
            recurse(i + 1);
    }
}.recurse(0);


предполагается копирование элементов листа из storage.list() в advertisements таким
вот способом, но почему-то по отработке кода лист пустой, что может быть не так?
    


Ответы

Ответ 1



Сложно сказать, почему у Вас что-то не работает. Возможно, проблема в другом коде, который мы не видим. Однако, на одну неточность можно указать сразу - всегда выполняется storage.list().get(0) без проверки списка на непустоту. Это может привести к исключению. Если же рассматривать идею, то она вполне работоспособная. Вот немного изменённый работающий код: import java.util.List; import java.util.ArrayList; class Test { public static void main(String [] args) { final List list1 = new ArrayList<>(); final List list2 = new ArrayList<>(); list1.add("String 1"); list1.add("String 2"); list1.add("String 3"); new Object() { public void recurse(final int i) { if (i < list1.size()) { list2.add(list1.get(i)); recurse(i + 1); } } }.recurse(0); System.out.println("List 1:"); for (final String s : list1) System.out.println("\t" + s); System.out.println("List 2:"); for (final String s : list2) System.out.println("\t" + s); } } Вывод программы: List 1: String 1 String 2 String 3 List 2: String 1 String 2 String 3

Ответ 2



Все разобрался, собственно грешил на анонимный класс, но сделал вот такую проверку public static void main(String[] args) { List p = new ArrayList<>(); Collections.addAll(p, 5, 6, 7); final List list = new ArrayList<>(); new Object() { public void recurse(int i) { list.add(p.get(i)); if (i + 1 < p.size()) recurse(i + 1); } }.recurse(0); for(int i : list) System.out.println(i); } и она отработал на ура. Потом продолжил реализацию своего кода, получился такой говнокод final List advertisements = new ArrayList<>(); new Object() { public void recurse(int duration) {recurse(duration, 0);} public void recurse(int duration, int i) { if(storage.list().get(i).getDuration() <= duration) advertisements.add(storage.list().get(i)); if (i + 1 < storage.list().size()) recurse(storage.list().get(i).getDuration() <= duration ? duration - storage.list().get(i).getDuration() : duration, i + 1); } }.recurse(timeSeconds); но хотя бы рабочий и меня пока устраивает. Спасибо всем за помощь и простите если не так выразился в описании

Комментариев нет:

Отправить комментарий