2015-04-21 5 views
1

Data SetАнализировать данные из текстового файла в HashMap

У меня есть текстовый файл, как в изображении, и я хочу, чтобы эти данные в HashMap, которые выглядят как-то this-

Madhya Pradesh Bhopal 
     Gwalior 
     Indore 
     Khandwa 

Goa  Mapusa 
     Margao 
     Bicholim 
     Panaji 

До сих пор я мог изолировать ключи и значения отдельных строк, но я понятия не имею, куда идти дальше. Что мне нужно сделать дальше?

while ((line=br.readLine())!=null){ 
    state=line.split("-")[0]; 
    city=line.split("-")[1]; 
} 
+0

возможно поставить его в HashMap? –

+0

да, это то, что я пытаюсь сделать .. но ключи разбросаны повсюду .. как я могу собрать их вместе? Я новичок в hashmap, поэтому извиняюсь, если я не понимаю –

ответ

1

Вы уже разделить их, просто добавьте их в Multimap: реализация Multimap можно найти в Apache Commons Collections.

MultiMap внутренне создает коллекцию, содержащую все записи для определенного ключа. Затем вы можете получить эти коллекции, если это необходимо.

MultiMap stateCityMap= new MultiHashMap(); 
String state; 
String city; 
while ((line=br.readLine())!=null){ 
    state=line.split("-")[0]; 
    city=line.split("-")[1]; 
    stateCityMap.put(state, city); 
} 

Edit:

Вы также можете сделать это без какой-либо собственной библиотеки:

Map<String, List<String>> stateCityMap= new HashMap<>(); 
String state; 
String city; 
while ((line=br.readLine())!=null){ 
    state=line.split("-")[0]; 
    city=line.split("-")[1]; 
    if(stateCityMap.get(state) == null) { 
     stateCityMap.put(state, new ArrayList<String>()); 
    } 
    stateCityMap.get(state).add(city); 
} 
+0

есть ли способ, которым я могу это сделать, не используя внешние коллекции и классы Java по умолчанию? –

+0

Я отредактировал ответ –

1

Вы можете поместить его в карту списка.

Map<String, List<String>> map = new HashMap<String, List<String>>(); 
List<String> cityList; 
while ((line = br.readLine()) != null) { 
    state = line.split("-")[0]; 
    city = line.split("-")[1]; 

    cityList = map.get(state); 
    if (cityList == null) { 
     cityList = new ArrayList<String>(); 
     map.put(state, cityList); 
    } 
    cityList.add(city); 
} 
+0

Да, именно, я пытаюсь создать список lis городов или значений. Но для этого мне нужно знать, какое значение связано с которым key .. из файла я не могу это изолировать. я могу получить только значения по одному –

+1

Я обновил свой ответ с помощью кода. –

+0

спасибо, @naman gala, именно то, что я хотел .. :) –

2

Поскольку каждый ключ связан со многими значениями, а не только один, вы должны использовать MultiMap интерфейс и его MultiValueMap из коллекций Apache (см. here)

Пример:

MultiMap<String, String> myMap = new MultiValueMap<String, String> 

myMap.put(state, city); 

Это добавит новое значение в коллекцию, связанную с этим ключом

[EDIT] Если вы хотите сделать это без использования внешней библиотеки, вы можете сделать это следующим образом

Map<String, List<String>> myMap = new HashMap<String, List<String>)(); 
if myMap.containsKey(state) { 
    List<String> cityList = myMap.get(state); 
    cityList.add(city); 
} else { 
    List<String> stateCityList = new ArrayList<String>(); 
    stateCityList.add(city); 
    myMap.put(state, stateCityList); 
} 

Это будет работать так, как вы этого хотите.

+0

, можно ли это сделать, не используя внешние коллекции и классы сбора по умолчанию Java? –

1
  1. Во-первых, не разделяйте столько раз, сколько у вас есть: установите переменную с результатом.
  2. Поместите все в Map< String, Collection<String>> (HashMap или TreeMap, которые будут сортировать города по штатам ....). Первый элемент будет соответствовать ключу, а второй будет добавлен к соответствующему значению коллекции.

Вот пример кода, который может проиллюстрировать:

Map<String, List<String> > map = new TreeMap<String, Collection<String>>(); 
Collection<String> cities; 
while ((line = br.readLine()) != null) { 
    String[] result = line.split("-"); 
    state = result[0]; 
    city = result[1]; 

    cities= map.get(state); 
    if (cities== null) { 
     cities = new ArrayList<String>(); 
     map.put(state, cities); 
    } 
    cities.add(city); 
} 
3

я увидел, что в другой вопрос, который вы используете Java 8.Если это так, то существует хороший способ, чтобы выполнить задание:

import static java.nio.file.Files.lines; 
import static java.nio.file.Paths.get; 
import static java.util.stream.Collectors.groupingBy; 
import static java.util.stream.Collectors.mapping; 
import static java.util.stream.Collectors.toList; 

... 

Map<String, List<String>> map = lines(get("file")) 
       .map(s -> s.split("-")) 
       .collect(groupingBy(arr -> arr[0], mapping(arr -> arr[1], toList()))); 

Чтобы объяснить немного, что происходит:

  • Files.lines создает Stream<String> (каждая строка представляет собой строку в файле)
  • тогда вы разделите каждую строку в тире (как вы это делали в цикле в то время), что дает вам Stream<String[]>
  • тогда вы собираете содержание потока путем группирования массивов с их первыми элементами (arr -> arr[0]). Это даст вам Map<String, List<String[]>
  • , но вы хотите, чтобы значение отображалось как второй элемент каждого массива, поэтому вы используете коллекционер mapping. Каждое значение затем собирается в List, в результате чего Map<String, List<String>>

Это обычная идиома в Java 8, это может быть немного трудно понять, на первый, но как только вы захватите понятие это очень мощный.

1. Под капотом этого Map<String, List<String[]> никогда не создается, но это легче визуализировать это как то

+1

Спасибо за объяснение вашего кода. +1 –