Более одного уникального ключа для проблемы HashMap (Java) - PullRequest
0 голосов
/ 24 апреля 2010

Этот вопрос является продолжением этой темы :

Вкратце: для решения моей проблемы я хочу использовать Map<Set<String>, String>.

Однако после сортировки записей данных в Excel удалите ненужные параметры, и получится следующее:

flow content ==> content content 
flow content ==> content depth distance 
flow content ==> content depth within 
flow content ==> content depth within distance 
flow content ==> content within 
flow content ==> content within distance 

У меня есть несколько уникальных ключей для hashmap, если это так. Как мне обойти это ... у кого-нибудь есть идеи?

Я думал о Map<Set <String>, List <String>>, чтобы я мог сделать что-то вроде:

Set <flow content>, List <'content content','content depth distance','content depth within ', ..., 'content within distance'>

Но поскольку я построчно анализирую записи Я не могу понять, как сохранить значения одних и тех же повторяющихся ключей (содержимое потока) в одном списке и добавить его на карту .

Кто-нибудь имеет грубую логику о том, как это можно сделать в Java?

Заранее спасибо.

- EDIT:

Попытка Multimap, но почему-то есть небольшая проблема:

public static void main(String[] args) {

    File file = new File("apriori.txt");
    Multimap<Set <String>, String> mm = HashMultimap.create();
    Set<String> s = null;
    List l = null;

    BufferedReader br = null;

    try {
            br = new BufferedReader(new FileReader(file));
            String line = "";

            while ((line = br.readLine()) != null) {
                //Regex delete only tokenize

                String[] string = line.split(";");
                System.out.println(string[0] + " " + string[1]);

                StringTokenizer st = new StringTokenizer(string[0].trim());
                while (st.hasMoreTokens()) {
                    //System.out.println(st.nextToken());
                    s = new HashSet<String>();
                    s.add(st.nextToken());
                }
                mm.put(s,string[1]);
            }

        // dispose all the resources after using them.
        br.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    Set<String> t = new HashSet<String>();
    t.add("content");
    t.add("by");

    String str = mm.get(t).toString();
    System.out.println(str);

    for (Map.Entry<Set <String>, String> e : mm.entries()) {
        System.out.println(e);
    }
}

apriori.txt

byte_jump ; msg 
byte_jump ; msg by 
content ; msg 
content by ; flow 
content by ; msg 
content by ; msg flow 
content by byte_jump ; msg 
content byte_jump ; by 
content byte_jump ; msg 
content byte_jump ; msg by

Видимо вывод для forloop:

[content]= msg 
[by]= flow 
[by]= msg 
[by]= msg flow 
[byte_jump]= msg 
[byte_jump]= by 
[byte_jump]= msg by 

вместо [content by] = поток сообщений

Почему это так? Я пытался, и это работает. Но мне нужно Set для сравнения строк независимо от положения. Что я могу сделать?

Ответы [ 4 ]

2 голосов
/ 25 апреля 2010

Относительно вашего кода с помощью MultiMap: единственное, что вы делаете неправильно, - это создаете новый набор для каждого токена вместо того, чтобы помещать все токены строки в один набор. Вот почему вы пропускаете токены. Это работает:

s = new HashSet<String>();
while (st.hasMoreTokens()) {
    //System.out.println(st.nextToken());
    s.add(st.nextToken());
}
2 голосов
/ 24 апреля 2010

Логика по сути:

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

Как уже упоминалось в другом плакате, вы можете рассмотреть стандартный класс библиотеки с несколькими картами, такой как в Google Collections. (Лично я сам реализовал бы это, потому что это действительно просто и не требует целой дополнительной библиотеки, на мой взгляд, но пробег меняется.)

1 голос
/ 25 апреля 2010
public static void main(String[] args) throws IOException {

    final File file = new File("apriori.txt");
    final Multimap<String, String> map = HashMultimap.create();

    final BufferedReader reader = new BufferedReader(new FileReader(file));

    while (true) {
        final String line = reader.readLine();
        if (line == null) break;
        final String[] parts = line.split(" ; ");
        map.put(parts[0].trim(), parts[1].trim());
    }

    for (Map.Entry<String, String> e : map.entries()) {
        System.out.println(e);
    }
}

Должен сделать свое дело. (Я не компилировал его, хотя никаких гарантий.)
Убедитесь, что вы используете Multimap<String, String>, нет необходимости использовать один набор элементов в качестве ключа.

1 голос
/ 24 апреля 2010

A multimap допускает несколько значений для определенного ключа.

Одной из реализаций являются различные Multimap s, которые предоставляются как часть Google Collections .

Вместо того, чтобы кодировать способ правильного хранения данных в Map<String, List<String>, вероятно, было бы лучше выбрать и использовать соответствующую структуру данных для работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...