Я плохо знаком с Java, и я должен составить список списков списков. Я мог сделать это в Python, потому что элемент списка может быть списком так во встроенном списке list[0]
обратился бы к списку и list[0][0]
относился бы к, обнуляет элемент встроенного списка. Там какой-либо простой способ состоит в том, чтобы реализовать это поведение в Java?
Все остальные ответы технически верны , но ИМХО, если вы реализуете приблизительный список списков списков, вы не обрабатываете свои данные на правильном уровне абстракции. Например, я почти уверен, что список списков уже означает «что-то» в вашей сфере деятельности. Инкапсулируйте это «что-то» в другом объекте, чтобы вы могли просто иметь List >>.
Как говорит Марио , вам, вероятно, нужно абстрагироваться от ваших данных немного дальше. Но следующее сделает то, что вам нужно.
В 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`
}
}
}
Поскольку все эти ответы вызывают у меня недоумение, могу я просто добавить предложение, что вы либо
Создаете тип данных для выражения ваших данных, инкапсулируя детали структуры, либо, по крайней мере,
Создаете тип ключа который обертывает 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);
}
}
}
Если у людей есть примеры установленных библиотек коллекций, которые уже занимаются подобными вещами, дайте мне знать, и я добавлю ссылки.
Хотя это, конечно, правда, что вы можете построить 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
Но действительно ли вы хотите обрабатывать это таким образом? Я не знаю, это зависит от того, что вам нужно с ним делать.
Исчерпывающий пример, показывающий 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