2016-04-03 4 views
1

Я использую файл, который состоит из:Добавление двух значений ключа в HashMap в Java

"word","wordtype","definition"

"Base","n.","The lower part of a robe or petticoat."

"Base","n.","An apron."

Выход следующим образом:

key: "base" value: ["word""wordtype""definition", "Base""n.""The lower part of a robe or petticoat.", "Base""n.""An apron."] key: "word" value: ["word""wordtype""definition", "Base""n.""The lower part of a robe or petticoat.", "Base""n.""An apron."]

Желаемый результат:

key: "base" value: [ "Base""n.""The lower part of a robe or petticoat.", "Base""n.""An apron."] key: "word" value: ["word""wordtype""definition"]

Может кто-то мне точку в правильном направлении?

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file))); 

    String line = null; 

    TreeMap<String, List<String>> def = new TreeMap<String, List<String>>(); 
    List<String> values = new ArrayList<String>(); 

     try { 
      while ((line = br.readLine()) != null) { 
       String []parts =line.split(","); 
       String key = null; 
       for (int i = 0; i < parts.length; i++){ 
        key = parts[0]; 
       } 

       values.add(parts[0] + parts[1] + parts[2]); 
       def.put(key.toLowerCase(), values); 

      } 
+0

Для начала: 'key = parts [0]' не должен находиться в цикле; 'values' должна быть новой переменной, определенной внутри цикла while, и вы должны добавить каждую часть, которую вы хотите добавить в список значений по одному, а не объединять их вместе с +. –

+0

Вы не можете использовать карту для этого. Один «ключ» должен соответствовать одному (или нет) «значению». Если вы хотите _similar_ функциональность; вы можете использовать «Список >». – user2478398

ответ

1

A Map не может работать по вашему запросу. Любой key может быть сопоставлен только с одним value.

Если вы хотите что-то сродни к тому, что вы делаете, но где вы можете иметь несколько values для данного key, вы могли бы сделать что-то вроде:

List<Map.Entry<String, List<String>>> def = new ArrayList<>(); 

Map.Entry<String, List<String>> entry = new AbstractMap.SimpleEntry<>(key, list); 
def.add(entry); 

Тогда итерацию через def:

for (Map.Entry<String, List<String>> entry : def) { 
    System.out.println(String.format("Key: %s. Values: %s", 
      entry.getKey(), 
      Arrays.toString(entry.getValue().toArray()))); 
} 

Edit:

Для вашего комментария: Если вы хотите что вы всегда можете свернуть свой собственный тип для хранения в Map (или List, если вам все еще нужно дубликаты ключей):

class WordDescription { 
    final String wordType; 
    final String definition; 

    WordDescription(String wordType, String definition) { 
     this.wordType = wordType; 
     definition = definition; 
    } 

    String getWordType() { 
     return wordType; 
    } 

    String getDefinition() { 
     return definition; 
    } 
} 

И использовать это в List<Map.Entry<String, WordDescription>>. Вы можете сделать wordTypeenum, если есть предопределенный набор из них (прилагательное, существительное и т. Д.).

+0

Спасибо, в идеале я хочу, чтобы ключ был как слово, и значение как ключевое словосочетание и определение, но у вас нет дубликатов ключей на картах. –

+0

@ b.d Отредактированный ответ, чтобы дать дополнительную помощь тому, что вы ищете. – user2478398

+0

Его отредактированный ответ действительно то, что вы хотите здесь. Вы хотите сохранить String-> YourCustomObject. Лично я бы добавил фактическое слово к вашему объекту WordDescription. Хотя вы можете подумать, что это дубликат, потому что это уже ключ к вашей карте, вы в конечном итоге получите лучшую рентабельность и инкапсуляцию из объекта в будущем. Скажем, вы возвращаете WordDescription, и он передается в другую часть вашей программы или хранится в другой структуре данных; если вы потеряете ключ карты, у вас больше нет никакого контекста о том, какое слово представляет ваш объект. –

Смежные вопросы