Java解析使用Hmap

时间:2012-11-30 14:30:38

标签: java parsing split

我是Java新手。我想解析这个格式的数据

苹果;芒果;橙色:1234;橙色:1244; ...;

任何时候都可能有不止一个“橘子”。数字(1,2 ......)增加,因此为“橙色”。

好。拆分后,让我们假设我已经将前两个数据(Apple,Orange)存储在一个变量(在setter中)中以在getter函数中返回相同的数据。现在我想将'orange'中的值(1234,1244 ....等)添加到变量中以便稍后返回。在此之前,我必须检查有多少橙子来了。为此,我知道我必须使用循环。但不知道如何将“值”存储到变量中。

请帮帮我们。

2 个答案:

答案 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]