我是Java新手。我想解析这个格式的数据
苹果;芒果;橙色:1234;橙色:1244; ...;
任何时候都可能有不止一个“橘子”。数字(1,2 ......)增加,因此为“橙色”。
好。拆分后,让我们假设我已经将前两个数据(Apple,Orange)存储在一个变量(在setter中)中以在getter函数中返回相同的数据。现在我想将'orange'中的值(1234,1244 ....等)添加到变量中以便稍后返回。在此之前,我必须检查有多少橙子来了。为此,我知道我必须使用循环。但不知道如何将“值”存储到变量中。
请帮帮我们。
答案 0 :(得分:0)
String input = "Apple;Mango;Orange:1234;Orange:1244;...;"
String values[] = input.split(";");
String value1 = values[0];
String value2 = values[1];
Hashmap< String, ArrayList<String> > map = new HashMap<String, ArrayList<String>>();
for(int i = 2; i < values.length; i = i + 2){
String key = values[i];
String id = values[i+1];
if (map.get(key) == null){
map.put(key, new ArrayList<String>());
}
map.get(key).add(id);
}
//for any key s:
// get the values of s
map.get(s); // returns a list of all values added
// get the count of s
map.get(s).size(); // return the total number of values.
答案 1 :(得分:0)
让我试着通过我如何解释它来重新解释这个问题 - 更重要的是 - 它如何关注输入和输出(期望),而不是实际的实现:
我需要解析字符串
"Apple;Mango;Orange:1234;Orange:1244;...;"
在某种程度上,我可以使用水果检索相关的值(
':'
之后的数字):
- 我应该在示例中收到 Apple 和 Mango 的空列表,因为它们没有价值;
- 我应该会收到 Orange 的
1234, 1244
列表。
当然,你对HashMap
的直觉是正确的,但如果你不太了解具体细节,有人可能总会提出更好的解决方案。
还剩下几个白点:
鉴于此背景,我们可以开始编写代码:
import java.util.*;
public class FruitMarker {
public static void main(String[] args) {
String input = "Apple;Mango;Orange:1234;Orange:1244";
// replace with parameter processing from 'args'
// avoid direct implementations in variable definitions
// also observe the naming referring to the function of the variable
Map<String, Collection<Integer>> fruitIds = new HashMap<String, Collection<Integer>>();
// iterate through items by splitting
for (String item : input.split(";")) {
String[] fruitAndId = item.split(":"); // this will return the same item in an array, if separator is not found
String fruitName = fruitAndId[0];
boolean hasValue = fruitAndId.length > 1;
Collection<Integer> values = fruitIds.get(fruitName);
// if we are accessing the key for the first time, we have to set its value
if (values == null) {
values = new ArrayList<Integer>(); // here I can use concrete implementation
fruitIds.put(fruitName, values); // be sure to put it back in the map
}
if (hasValue) {
int fruitValue = Integer.parseInt(fruitAndId[1]);
values.add(fruitValue);
}
}
// display the entries in table iteratively
for (Map.Entry<String, Collection<Integer>> entry : fruitIds.entrySet()) {
System.out.println(entry.getKey() + " => " + entry.getValue());
}
}
}
如果执行此代码,您将获得以下输出:
Mango => []
Apple => []
Orange => [1234, 1244]