将数据从文本文件解析为Hashmap

时间:2015-04-21 10:45:09

标签: java list file arraylist hashmap

Data Set

我有一个类似图像中的文本文件,我希望将这些数据放在一个hashmap中,看起来像这样 -

Madhya Pradesh  Bhopal
        Gwalior
        Indore
        Khandwa

Goa     Mapusa
        Margao
        Bicholim
        Panaji

到目前为止,我已经能够隔离键并重视单个字符串,但我不知道从那里开始。接下来我需要做什么?

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

5 个答案:

答案 0 :(得分: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>(每个字符串是文件中的一行)
  • 然后你用破折号分割每一行(就像你在while循环中所做的那样),它给你一个Stream<String[]>
  • 然后通过将数组与其第一个元素(arr -> arr[0])分组来收集Stream的内容。这将为您提供Map<String, List<String[]> 1
  • 但您希望映射的值是每个数组的第二个元素,因此您使用mapping收集器。然后将每个值收集到List中,生成Map<String, List<String>>

这是Java 8中常见的习惯用法,起初可能有点难以理解,但一旦你抓住这个概念就会非常强大。

1。在引擎盖下,这个Map<String, List<String[]>永远不会被创建,但是更容易将其可视化

答案 1 :(得分:2)

由于每个键都链接到许多值而不仅仅是一个值,因此您应该使用MultiMap接口及其Apache集合中的MultiValueMap(参见here

示例:

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

myMap.put(state, city);

它会将新值添加到与该键相关联的集合

[编辑]如果您想在不使用外部库的情况下执行此操作,可以按照以下方式执行此操作

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);
}

这可以按你想要的方式工作。

答案 2 :(得分: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);
}

答案 3 :(得分:1)

您已将它们拆分,只需将它们添加到MultiMap:可以在Apache Commons Collections中找到MultiMap的实现。

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);
}

修改

你也可以这样做,没有任何专有库:

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);
}

答案 4 :(得分:1)

  1. 首先,不要将项目拆分多次:使用结果设置变量。
  2. 将所有内容放入Map< String, Collection<String>>(HashMap或TreeMap,它将按州对城市进行排序....)。第一个项目对应于密钥,第二个项目将添加到相应的集合值。
  3. 以下是可以说明它的代码示例:

    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);
    }