Java: итерация HashMap - необходим алгоритм - PullRequest
1 голос
/ 19 декабря 2009

У меня есть список имен, скажем, 8 имен: Джо, Боб, Эндрю, Билл, Чарли, Сара, Энн, Виктор

Количество имен может отличаться **.

1) Что я должен использовать в качестве списка имен? Hashmap, Vector, Hashtable, List, ArrayList?

2) Мне нужно сопоставить их так: Джо-Боб, Эндрю-Билл, Чарли-Сара, Энн-Виктор. Не могли бы вы показать мне пример, как сделать цикл, который бы сделал это?

Спасибо!

Ответы [ 5 ]

1 голос
/ 19 декабря 2009

1) Что я должен использовать в качестве списка имен? Hashmap, Vector, Hashtable, List, ArrayList?

Ну, это зависит от ваших потребностей :) Но из-за вопроса и потому, что вы смешиваете интерфейсы коллекций (например, List) и конкретные реализации (например, ArrayList или Vector), я думаю, что вы должны начать с основ. потрясающим ресурсом для этого является Trail: Collections из Учебников по Java (tm), очень рекомендуемое чтение.

Во-первых, вам необходимо понять различные интерфейсы коллекций и их назначение. Тогда вы выберете конкретные реализации. Раздел Interfaces учебника, который я цитирую ниже, поможет вам сделать первый шаг:

Следующий список описывает ядро интерфейсы коллекции:

  • Collection - корень иерархии коллекции. Коллекция представляет группу объектов, известных как его элементы. Интерфейс Collection наименее распространенный знаменатель, который все коллекции реализуются и используются передавать коллекции и манипулировать ими, когда максимум общность желательна. Некоторые типы коллекции позволяют дублировать элементы, а другие нет. Некоторые заказаны и другие неупорядочены. Ява Платформа не обеспечивает прямой реализации этого интерфейса, но обеспечивает реализацию более конкретные подынтерфейсы, такие как Set и List. Также см. Коллекция Интерфейс секция.

  • Set - коллекция, которая не может содержать повторяющиеся элементы. это интерфейс моделирует математический набор абстракция и используется для представления наборы, такие как карты, содержащие покерная комбинация, курсы, составляющие расписание студента, или процессы работает на машине. Смотри также Набор Интерфейс секция.

  • List - упорядоченная коллекция (иногда называемая последовательностью). Списки может содержать повторяющиеся элементы. Пользователь списка обычно имеет точный контролировать, где в списке каждый элемент вставлен и может получить доступ элементы по их целочисленному индексу (позиция). Если вы использовали Vector, ты знаком с генералом аромат List. Также см. Список Интерфейс секция.

  • Queue - коллекция, используемая для хранения нескольких элементов перед обработкой. Помимо основных операций по сбору, Очередь обеспечивает дополнительную вставку, добыча и инспекционные операции.

    Очереди обычно, но не обязательно, заказать элементы в FIFO (первым пришел - первым вышел). среди исключения являются приоритетными очередями, какие элементы заказа в соответствии с поставляемый компаратор или элементы естественный порядок. Безотносительно порядок используется, руководитель очереди это элемент, который будет удален по телефону remove или poll. В ФИФО очередь, все новые элементы вставлены в хвосте очереди. Другие виды очередей может использовать разное размещение правила. Каждая Queue реализация должна указать его упорядочивающие свойства. Также см. раздел Интерфейс очереди .

  • Map - объект, который сопоставляет ключи со значениями. Карта не может содержать дубликат ключи; каждый ключ может отображаться не более одного значение. Если вы использовали Hashtable, вы уже знакомы с основы Map. Также см. Карта Интерфейс секция.

В вашем случае, я не думаю, что вы хотите Queue, я не уверен, что вам нужен Map, я думаю, что вы хотите разрешить дублирование элементов, чтобы вы не хотели Set и это оставляет нас с List.

Что касается конкретной реализации, если потокобезопасная реализация не требуется, ArrayList - или LinkedList, в зависимости от алгоритма в 2) - может быть хорошим выбор). Но на самом деле, посмотрите раздел Реализации этого учебника, чтобы узнать больше.

2) Мне нужно сопоставить их так: Джо-Боб, Эндрю-Билл, Чарли-Сара, Энн-Виктор. Не могли бы вы показать мне пример, как сделать цикл, который бы сделал это?

Если первоначальный список может содержать дубликаты элементов, я бы не использовал Map для хранения совпадающих имен (поскольку Map не может содержать дубликаты ключей). Итак, я бы создал Couple класс для хранения связанных имен:

public class Couple {
    private name1;
    private name2;
    ...
}

и используйте List<Couple> для хранения совпадающих имен. Но, поскольку логика алгоритма все еще не ясна (всегда ли первоначальный список содержит нечетное количество элементов? Всегда ли один элемент связан с ближайшим следующим?), Я не могу дать больше указаний.

1 голос
/ 19 декабря 2009

Hashmaps не имеют порядка. Если вы хотите вставить список имен, как вы хотите, вы должны сделать что-то вроде следующего (с массивом):

for(int i = 0; i < myArray.length - 1; i += 2) {
    hashMap.add(myArray[i], myArray[i+1]);
}
0 голосов
/ 19 декабря 2009

Если у вас есть массив для начала, но вы хотите удалить элементы по мере их обработки, сначала преобразуйте его в List некоторого вида. Кроме того, удаление элементов из начала ArrayList может быть очень дорогим, поэтому, если у вас много имен, вы можете использовать либо LinkedList (хотя есть очень мало причин для фактического использования этого между производительностью и Использование памяти, лучше иметь циркуляр List, но это не входит в стандартную комплектацию Java).

Итак, в вашем случае вы знаете, что будете обрабатывать список последовательно, поэтому наиболее эффективным, что я могу придумать, является создание ArrayList и обратный просмотр, а затем удаление с конца, например:

private Map matchNames(String[] names) {
    List namesList = new ArrayList(Arrays.asList(names));
    Collections.reverse(namesList);

    Map result = new HashMap(namesList.size() / 2);
    while (!namesList.isEmpty()) {
        result.put(namesList.remove(namesList.size() - 1), 
            namesList.remove(namesList.size() - 1));
    }

    return result;
}
0 голосов
/ 19 декабря 2009

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

В противном случае вы можете просто создать класс, в котором вы можете хранить информацию о каждом человеке (имя, фамилия, телефон и т. Д.) И использовать Vector для хранения экземпляров этого класса. Примером этого класса может быть:

class PersonDetails {

    String firstName;
    String lastName;

    public PersonDetails(String fn, String ln) {
        firstName = fn;
        lastName = ln;
    }
}

Для вставки имен в векторе вы можете использовать что-то вроде следующего:

for(int i = 0; i < nameArray.length; i += 2) {
    vector.add(new PersonDetails(nameArray[i], nameArray[i+1]));
}
0 голосов
/ 19 декабря 2009

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

Вы можете создать пару имен следующим образом:

String input = "Joe, Bob, Andrew, Bill, Charlie, Sarah, Ann, Victor";
String names[] = input.split(",");
Map<String, String> output = new HashMap<String, String>();
for (int i=0; i<names.length; i+=2) {
  output.put(names[i].trim(), names[i+1].trim());
}

и затем сделайте:

output.remove("Joe"); // Joe is paired with Bob

Если вам также нужно связать Боба с Джо, вы можете сделать это следующим образом:

String input = "Joe, Bob, Andrew, Bill, Charlie, Sarah, Ann, Victor";
String names[] = input.split(",");
Map<String, String> output = new HashMap<String, String>();
for (int i=0; i<names.length; i+=2) {
  String first = names[i].trim();
  String second = names[i+1].trim();
  output.put(first, second);
  output.put(second, first);
}

и затем сделайте:

String other = output.remove("Joe");
output.remove(other);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...