2013-06-03 2 views
0

Файл:список как значение HashMap в Java

Person1:AP 
Person2:AP 
Person3:KE 
Person4:KE 
Person5:UK 
Person6:AP 
Person7:UK 
Person8:AP 

То, что я попытался это:

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.HashMap; 

public class TestNull { 

    public static void main (String args[]) throws IOException { 

     BufferedReader br = new BufferedReader (new FileReader("/home/username/Desktop/test")); 
     String str; 
     HashMap<String, String> h = new HashMap<String, String>(); 

     try { 
      while ((str = br.readLine()) != null) { 
       String[] s = str.split(":"); 
       h.put(s[1],s[0]); 
      } 
      System.out.println(h); 
     } 

     catch (FileNotFoundException E) { 
      System.out.println("File Not Found"); 
     } 
     finally { 
      br.close(); 
     } 
    } 
} 

Я мог бы достичь этого Perl:

use strict; 
use warnings; 

open (FILE,"test"); 

my %hash=(); 
while (my $line = <FILE>) { 

    chomp $line; 

    my ($name,$country) = split(":", $line); 

    chomp ($name,$country); 

    $hash{$country} .= "$name ";  
} 

for my $keys (keys %hash) { 

    print "$keys: $hash{$keys}\n"; 

} 

Из файла данных , Я ищу выход так:

{AP = [person1, person 2, person6, person8], KE = [person3, person4], UK = [person5, person7]} 
+1

Что именно вы спрашиваете? –

ответ

1

Ниже то, что вам нужно -

Map<String, List<String>> h = new HashMap<String, List<String>>(); 

И для каждой строки -

String[] s = str.split(":"); //s[1] should be the key, s[0] is what should go into the list 
List<String> l = h.get(s[1]); //see if you already have a list for current key 
if(l == null) { //if not create one and put it in the map 
    l = new ArrayList<String>(); 
    h.put(s[1], l); 
} 
l.add(s[0]); //add s[0] into the list for current key 
+1

Подсказка: OP ищет 'LinkedHashMap' вместо' HashMap'. Прочтите желаемый результат. –

+0

@gthm geeky: если порядок (в котором строки прочитаны) должен быть сохранен, то просто замените 'new HashMap >()' с 'new LinkedHashMap >()', как предложил Луиджи , –

+0

@LuiggiMendoza: пример Perl OP не указывает, что он хочет использовать LinkedHashmap. –

0

HashMap.put() заменит любой элемент, который вы уже вставлен в хэш-карте. Сначала нужно попытаться получить существующий ключ на карте, и если он уже существует (т. Е. Был вставлен для предыдущей строки ввода), вы можете добавить текущее имя к его значению и снова вставить его в карту ,

Кроме того, вы, вероятно, захотите использовать что-то вроде List<String>, чтобы удерживать значения карты (имена), а не только String. Использование списка также избавляет вас от необходимости вставлять значение, поскольку вы можете просто добавить его в список, который уже находится на карте.

0

Вам просто нужно изменить while и тип карты:

Map<String, List<String>> h = new HashMap<String, List<String>>(); 

/* (...) */ 

while ((str = br.readLine()) != null) { 

    String[] s = str.split(":"); 
    list = h.get(s[1]); 
    if(list==null) { 
     list = new ArrayList<String>(); 
    } 
    list.add(s[0]); 
    h.put(s[1],list); 

} 
0

Для того, чтобы превратить эту карту с ног на голову, вы, вероятно, хотите:

HashMap<String, String> h = new HashMap<String, String>(); 
... 
// your reading code 
... 
HashMap<String,ArrayList<String>> map = new HashMap<String,ArrayList<String>>(); 
... 
for(String key: h.keySet()) { 
    if(!map.hasKey(key)) { 
     map.put(key, new ArrayList<String>()); 
    } 
    map.get(key).add(h.get(key)); 
} 

и теперь «карта» содержит желаемые структурированные данные, с «AP», указывающие на arraylist (person1, person 2, person6, person8) и т. д.

0

Альтернативой другим решениям будет использовать один o f реализация Multimap из Guava. Это может быть излишним, чтобы добавить такую ​​зависимость, если это единственная такая карта у вас есть, но если ветер с кучей карт такого рода, это приятно не иметь этого шаблонного во всем:

if (!map.containsKey(key)) { 
    map.put(key, new List<Foo>()); 
} 
map.get(key).add(value); 

Когда вы только что можете сделать:

multimap.put(key, value); 

Вместо этого. Существует ряд реализаций в зависимости от того, что вы хотите.

Сортировка: http://guava-libraries.googlecode.com/svn/tags/release03/javadoc/com/google/common/collect/TreeMultimap.html

же порядке, как вы добавили их: http://guava-libraries.googlecode.com/svn/tags/release03/javadoc/com/google/common/collect/LinkedHashMultimap.html

Не заботьтесь о заказе: http://guava-libraries.googlecode.com/svn/tags/release03/javadoc/com/google/common/collect/HashMultimap.html

https://code.google.com/p/guava-libraries/

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