Java如何从ArrayList

时间:2016-01-12 09:59:17

标签: java arrays csv

我有一个CSV文件,其中包含规则和规则转换。 CSV文件如下所示:

CSV FILE:
          #RULENAME, RULEVERSION
          RULE,01-02-01
          RULE,01-02-02
          RULE,01-02-34
          OTHER_RULE,01-02-04
          THIRDRULE, 01-02-04
          THIRDRULE, 01-02-04

如您所见,1个规则可以包含1个或更多规则版本。我需要做的是读取这个CSV文件并将它们放在一个数组中。我目前正在使用以下脚本执行此操作:

 private static List<String[]> getRulesFromFile() {
         String csvFile = "rulesets.csv";
         BufferedReader br = null;
         String line = "";
         String delimiter = ",";

         List<String[]> input = new ArrayList<String[]>();

         try {
                br = new BufferedReader(new FileReader(csvFile));
                while ((line = br.readLine()) != null) {
                       if (!line.startsWith("#")) {
                              String[] rulesetEntry = line.split(delimiter);
                              input.add(rulesetEntry);
                       }
                }

         } catch (FileNotFoundException e) {
                e.printStackTrace();
         } catch (IOException e) {
                e.printStackTrace();
         } finally {
                if (br != null) {
                       try {
                              br.close();
                       } catch (IOException e) {
                              e.printStackTrace();
                       }
                }
         }
         return input;
   }

但我需要调整脚本以便以下列格式保存信息:

ARRAY (
          => RULE       => 01-02-01, 01-02-02, 01-02-04
          => OTHER_RULE => 01-02-34
          => THIRDRULE  => 01-02-01, 01-02-02
          )

最好的方法是什么?多维数组?我怎样才能确保它不会多次保存rulename?

5 个答案:

答案 0 :(得分:3)

您应该使用不同的数据结构,例如HashMap,就像这样。

    HashMap<String, List<String>> myMap = new HashMap<>();

    try {
        br = new BufferedReader(new FileReader(csvFile));
        while ((line = br.readLine()) != null) {
            if (!line.startsWith("#")) {
                String[] parts = string.split(delimiter);
                String key     = parts[0];
                String value   = parts[1];
                if (myMap.containsKey(key)) {
                    myMap.get(key).add(value);
                } else {
                    List<String> values = new ArrayList<String>();
                    values.add(value);
                    myMap.put(key, values);
                }
            }
        }

这应该有效!

答案 1 :(得分:2)

在这里看到使用ArrayList不是一个好的数据结构。

我个人建议您为此特定目的使用 HashMap&gt;

规则将是您的,规则版本将是您的,它将是一个字符串列表。

在遍历原始文件时,只需检查规则(密钥)是否存在,然后将该值添加到已存在的规则版本(值)列表中,否则添加新密钥并将值添加到其中。

答案 2 :(得分:1)

例如:

public List<String> removeDuplicates(List<String> myList) {
    Hashtable<String, String> hashtable=new Hashtable<String, String>();
    for(String s:myList) {
        hashtable.put(s, s);
    }
    return new ArrayList<String>(hashtable.values());
}

答案 3 :(得分:0)

这正是key - value对可用于的对象。只需看看Map Interface即可。在那里,您可以定义一个包含各种元素作为值的唯一键,完全适合您的问题。

答案 4 :(得分:0)

<强>代码:

// This collection will take String type as a Key 
// and Prevent duplicates in its associated values

Map<String, HashSet<String>> map = new HashMap<String,HashSet<String>>();

// Check if collection contains the Key you are about to enter
// !REPLACE! -> "rule"  with the Key you want to enter into your collection
// !REPLACE! -> "whatever" with the Value you want to associate with the key

if(!map.containsKey("rule")){
map.put("rule", new HashSet<String>());
}
else{
map.get("rule").add("whatever");
}

参考:

Set
Map