我有这个问题,我不知道如何接近。我有两个数组列表,一个包含String,另一个包含整数,如下所示:
* Utah 5
* Nevada 6
* California 12
* Oregon 8
* Utah 9
* California 10
* Nevada 4
* Nevada 4
* Oregon 17
* California 6
我需要在数组列表中生成这样的结果: 犹他[5,9]内华达[6,4,4]加利福尼亚[12,10,6]。
老实说,我不知道如何处理这个问题,而且我正在寻找关于如何做到这一点的建议。
我被建议使用arraylist of arraylist,这是我到目前为止所做的。
int i=0;
ArrayList<ArrayList<Integer>> values = new ArrayList<ArrayList<Integer>>();
while (i<categories.size())
{
String cat=categories.get(i);
i++;
for (int r = 0; r < column1.size();r++) {
if(column1.get(r)==cat)
{
int value = column2.get(r);
ArrayList<Integer> val=new ArrayList<Integer>();
val.add(value);
values.add(val);
}
}
Column1 =状态列表,column2 =整数列表和categories = categories list。
我现在的问题是for循环似乎只是一遍又一遍地添加相同的数组,直到while循环完成。有什么建议吗?
答案 0 :(得分:5)
您可以使用以下方法解决问题:
List<String> states = Arrays.asList(
"Utah", "Nevada", "California", "Oregon", "Utah",
"California", "Nevada", "Nevada", "Oregon", "California"
);
List<Integer> values = Arrays.asList(5, 6, 12, 8, 9, 10, 4, 4, 17, 6);
Map<String, List<Integer>> resultMap =HashMap<String, Arraylist<>>();
for(int i = 0; i < states.size(); i++)
{
if( resultMap.get(states.get(i))!=null){
resultMap.get(states.get(i)).add(values.get(i));
}else{
List<Integer> valuelist = new ArrayList<>();
valuelist.add(values.get(i));
resultMap.put(states.get(i),valuelist);
}
}
resultMap包含您所需的答案。
答案 1 :(得分:2)
这个似乎就像一个家庭作业级别的问题,并且使用Integer
Map
列表String
来解决这个问题相对简单明了}。我正在回答玩演示一些较新的 Java 8 功能:
List<String> states = Arrays.asList(
"Utah", "Nevada", "California", "Oregon", "Utah",
"California", "Nevada", "Nevada", "Oregon", "California"
);
List<Integer> values = Arrays.asList(
5, 6, 12, 8, 9,
10, 4, 4, 17, 6
);
assert states.size() == values.size();
Map<String, List<Integer>> collated = new LinkedHashMap<>();
for (int i = 0, len = states.size(); i < len; i++) {
String state = states.get(i);
Integer value = values.get(i);
collated.computeIfAbsent(state, x -> new ArrayList<>()).add(value);
}
collated.forEach( (k,v) -> System.out.printf("%s %s%n", k, v) );
输出:
Utah [5, 9]
Nevada [6, 4, 4]
California [12, 10, 6]
Oregon [8, 17]
答案 2 :(得分:1)
这是使用Java 8功能计算此功能的另一种方法,但这次使用的是流。 (脚手架来自@William Price's answer)
List<String> states = Arrays.asList(
"Utah", "Nevada", "California", "Oregon", "Utah",
"California", "Nevada", "Nevada", "Oregon", "California"
);
List<Integer> values = Arrays.asList(5, 6, 12, 8, 9, 10, 4, 4, 17, 6);
assert states.size() == values.size();
Map<String, List<Integer>> collated = IntStream.range(0, states.size()).boxed().collect(
Collectors.groupingBy(states::get, LinkedHashMap::new,
Collectors.mapping(values::get, Collectors.toList())));
collated.forEach((k,v) -> System.out.printf("%s %s%n", k, v));
使用多个输入源在流中可能很不方便,但使用索引流非常适合这种“对应列表”情况。 groupingBy
按照states
列表中的值对索引进行分类,mapping
将索引映射到values
列表中的值,然后toList
收集他们进入一个清单。使用LinkedHashMap
会保留插入顺序。