我有一个类似图像中的文本文件,我希望将这些数据放在一个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];
}
答案 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>
(每个字符串是文件中的一行)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)
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);
}