Многомерный массив неизвестного размера

Мне нужно создать массив неопределенного размера, который будет содержать информацию о пользователе.

Например:

user[0]["name"] = "Patrick";

Однако для стандартного массива Java требуется известная длина, которую я не знаю.

Какую альтернативу я могу использовать? (Я также с удовольствием увижу несколько примеров кода) Я использую инфраструктуру TCP (kryonet), который не позволяет передавать объекты конструкторам. Поэтому, насколько я понимаю, создание объекта User невозможно.


person Patrick Reck    schedule 03.12.2012    source источник
comment
Вы можете сохранить ArrayList<Person>, где Person содержит атрибут name.   -  person Andrew Thompson    schedule 03.12.2012
comment
Просто примечание: kryonet ДЕЙСТВИТЕЛЬНО позволяет вам передавать объекты с помощью конструкторов, просто требуется, чтобы также был пустой () конструктор.   -  person Cameron Fredman    schedule 26.02.2013


Ответы (4)


В Java мы можем использовать только целочисленные значения для индексов ячеек.

Я думаю, вы ищете список карт:

List<Map<String, String>> persons = new ArrayList<Map<String, String>>();

// add Patrick
Map<String, String> person = new HashMap<String, String>();
person.put("name", "Patrick");
person.put("age", "23");
persons.add(person);

// add Sue
person = new HashMap<String, String>();
person.put("name", "Sue");
person.put("age", "21");
persons.add(person);

Например, чтобы получить доступ ко всем именам:

for (Map<String, String> person:persons) {
  System.out.println(person.get("name"));
}
person Andreas Dolk    schedule 03.12.2012
comment
Это определенно то, что мне нужно. Однако я не могу добавить несколько человек, он просто перезаписывает остальных. Как мне добавить несколько человек к этому? :-) - person Patrick Reck; 03.12.2012
comment
Каждый человек — это карта в списке. Просто создайте новую карту для каждого нового человека и добавьте ее в список (лиц). Я добавил Патрика в последнюю строку. - person Andreas Dolk; 03.12.2012
comment
Я не могу заставить его работать. Не могли бы вы расширить свой пример, включив в него второго человека? - person Patrick Reck; 03.12.2012

Во-первых, вы должны использовать объекты вместо произвольных структур данных, и если вы не знаете размер, я бы использовал список

List<Person> people = new ArrayList<Person>();
people.add(new Person("Patrick"));
person Peter Lawrey    schedule 03.12.2012
comment
Проблема в том, что у моего класса Player есть конструктор, который используемая мной структура TCP (Kryonet) не позволяет отправлять - person Patrick Reck; 03.12.2012
comment
Вы не можете отправить какой-либо объект, даже объект String, через TCP. Вы должны сериализовать/закодировать его каким-то образом. Я бы определил ваш класс так, как он должен, и сериализовал бы его как отдельное рассмотрение. - person Peter Lawrey; 03.12.2012
comment
Я имею в виду, что сериализатор фреймворков не может обрабатывать объекты с конструкторами :-) - person Patrick Reck; 03.12.2012
comment
Есть способы исправить это в фреймворке (я предполагаю, что это не вариант), но обычно фреймворки требуют, чтобы у вас был только общедоступный конструктор, а не единственный конструктор. - person Peter Lawrey; 03.12.2012

вы не можете использовать ассоциативные массивы в java. Другими словами, вы не можете использовать «имя» в качестве ключа.

Но вы можете создавать пустые массивы без указания размера, выполнив:

String[] array = new String[]{};

Однако попытка поместить что-то в этот массив приведет к исключению indexoutofbound.

person Runar Halse    schedule 03.12.2012

Вам следует рассмотреть возможность создания класса (например, Person) и использовать только список для управления им. Вы могли бы сделать что-то вроде этого:

List<Peson> myLyst = new ArrayList<Person>();
Person person = new Person("Patrick");
myList.add(0, person);
person Daniel Pereira    schedule 03.12.2012