Список списков списков

Я плохо знаком с Java, и я должен составить список списков списков. Я мог сделать это в Python, потому что элемент списка может быть списком так во встроенном списке list[0] обратился бы к списку и list[0][0] относился бы к, обнуляет элемент встроенного списка. Там какой-либо простой способ состоит в том, чтобы реализовать это поведение в Java?

15
задан Eng.Fouad 29 August 2011 в 20:40
поделиться

5 ответов

Все остальные ответы технически верны , но ИМХО, если вы реализуете приблизительный список списков списков, вы не обрабатываете свои данные на правильном уровне абстракции. Например, я почти уверен, что список списков уже означает «что-то» в вашей сфере деятельности. Инкапсулируйте это «что-то» в другом объекте, чтобы вы могли просто иметь List вместо сложного в использовании и обслуживании List >>.

27
ответ дан 1 December 2019 в 00:23
поделиться

Как говорит Марио , вам, вероятно, нужно абстрагироваться от ваших данных немного дальше. Но следующее сделает то, что вам нужно.

В Java вы бы сделали что-то вроде:

List<List<List<Object>>> listOfListsOfLists =new ArrayList<List<List<Object>>>();

Затем для доступа к элементам вы должны использовать:

listOfListsOfLists.get(a).get(b).get(c);

Или, чтобы перебрать все:

for (List<List<Object>> list2: listOfListsOfLists) {
    for (List<Object> list1: list2) {
        for (Object o: list1) {
            // use `o`
        }
    }
}
12
ответ дан 1 December 2019 в 00:23
поделиться

Поскольку все эти ответы вызывают у меня недоумение, могу я просто добавить предложение, что вы либо

  1. Создаете тип данных для выражения ваших данных, инкапсулируя детали структуры, либо, по крайней мере,

  2. Создаете тип ключа который обертывает int [] (но правильно переопределяет equals и hashCode) и вместо этого использует HashMap? Как правило, вся ваша трехмерная структура в любом случае будет сильно заполнена.

Еще лучше вы могли бы инкапсулировать эту карту и использовать varargs для чистого доступа.

public class NDimensionalArray<V> {
    private final int dimensions;
    private final Map<Key, V> values = new HashMap<Key, V>();

    private NDimensionalArray(int dimensions) {
        this.dimensions = dimensions;
    }

    public V get(int... indices) {
        checkIndices(indices);
        return values.get(new Key(indices));
    }

    public void set(V value, int... indices) {
        checkIndices(indices);
        values.put(new Key(indices), value);
    }

    private void checkIndices(int[] indices) {
        if ( indices.length != dimensions ) {
            throw new IllegalArgumentException();
        }
    }

    private static final class Key {
        private final int[] indices;

        private Key(int[] indices) {
            this.indices = indices;
        }

        @Override
        public int hashCode() {
            return Arrays.hashCode(indices);
        }

        @Override
        public boolean equals(Object obj) {
            return Arrays.equals(indices, ((Key)obj).indices);
        }
    }
}

Если у людей есть примеры установленных библиотек коллекций, которые уже занимаются подобными вещами, дайте мне знать, и я добавлю ссылки.

5
ответ дан 1 December 2019 в 00:23
поделиться

Хотя это, конечно, правда, что вы можете построить List> в Java, я не могу не задаться вопросом, зачем вам это нужно? Не то, чтобы было немыслимо, что это лучшее решение вашей проблемы, но вау, например, зачем?

Думаю, я мог бы представить что-то вроде

public class Employee ...
List<Employee> store; // all the employees in a store
List<List<Employee>> city; // all the store lists for a city
List<List<List<Employee>>> nation; // all the store lists for the nation

Но действительно ли вы хотите обрабатывать это таким образом? Я не знаю, это зависит от того, что вам нужно с ним делать.

3
ответ дан 1 December 2019 в 00:23
поделиться

Исчерпывающий пример, показывающий List-of-List с коллекциями и дженериками (Java 1.5 +)

// declare the list of lists
List<List<String>> listOfListOfStrings = new ArrayList<List<String>>();

// populate
List<String> listOfStrings = new ArrayList<String>(); // one inner list
listOfStrings.add("one-one");
listOfStrings.add("one-two");
listOfListOfStrings.add(listOfStrings);

listOfStrings = new ArrayList<String>(); // and another one
listOfStrings.add("two-one");
listOfStrings.add("two-two");
listOfListOfStrings.add(listOfStrings);

// access
String oneOne = listOfListOfStrings.get(0).get(0);   // first element of first inner list
String twoTwo = listOfListOfStrings.get(1).get(1);   // second element of second inner list
2
ответ дан 1 December 2019 в 00:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: