让我尝试通过我如何解释这个问题以及——更重要的是——它如何关注输入和输出(期望)而不是实际实现来重新表述这个问题:
我需要解析字符串
"Apple;Mango;Orange:1234;Orange:1244;...;"
在某种程度上,我可以检索':'
与水果相关的值(之后的数字):
- 在示例中,我应该收到Apple和Mango的空列表,因为它们没有价值;
- 我应该收到一份橙色
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]