我有一个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?
答案 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");
}
参考: