我的文件中有key/value
形式的字符串,就像人和计数一样,例如
"Reggy, 15"
"Jenny, 20"
"Reggy, 4"
"Jenny, 5"
并且在输出中我应该根据键总结所有计数值,因此我们的示例输出将是
“Reggy,19” “珍妮,25岁”
这是我的方法:
,
作为分隔符示例实施:
public static void main(final String[] argv) {
final File file = new File("C:\\Users\\rachel\\Desktop\\keyCount.txt");
try {
final Scanner scanner = new Scanner(file);
while (scanner.hasNextLine()) {
if (scanner.hasNext(".*,")) {
String key;
final String value;
key = scanner.next(".*,").trim();
if (!(scanner.hasNext())) {
// pick a better exception to throw
throw new Error("Missing value for key: " + key);
}
key = key.substring(0, key.length() - 1);
value = scanner.next();
System.out.println("key = " + key + " value = " + value);
}
}
} catch (final FileNotFoundException ex) {
ex.printStackTrace();
}
}
第一部分我不清楚如何在读取它们时划分键/值对并根据它创建HashMap。
这也是我建议的最佳方法,还是有提高性能的方法。
答案 0 :(得分:8)
由于这几乎肯定是一个学习练习,我将远离编写代码,让你享受所有的乐趣。
创建HashMap<String,Integer>
。每次看到键/值对时,检查哈希映射是否具有键的值(使用'containsKey(key)')。如果是,请使用get(key)
获取旧值,添加新值,然后使用put(key, newValue)
存储结果。如果密钥还没有,请添加一个新密钥 - 再次使用put
。如果int
(请使用String value
),请不要忘记Integer.valueOf(value)
。
就优化而言,此时的任何优化都为时过早:它甚至都不起作用!但是,很难比单个循环更快,这也很简单。
答案 1 :(得分:2)
对于阅读,个人而言,我会使用:
Scanner.nextLine()
,String.split(",")
和Integer.valueOf(value)
答案 2 :(得分:2)
试试这个:
Map<String, Long> map = new HashMap<String, Long>();
while (scanner.hasNextLine()) {
if (scanner.hasNext(".*,")) {
....
if(map.containsKey(key))
map.put(key, map.get(key) + Long.valueOf(value));
else
map.put(key, Long.valueOf(value));
}
}
答案 3 :(得分:2)
最简单的方法我可以考虑拆分值:
BufferedReader reader = new BufferedReader(new FileReader(file));
Map<String, Integer> mapping = new HashMap<String,Integer>();
String currentLine;
while ((currentLine = reader.readLine()) != null) {
String[] pair = currentLine.split(",");
if(pair.length != 2){ //could be less strict
throw new DataFormatException();
}
key = pair[0];
value = Integer.parseInt(pair[1]);
if(map.contains(key)){
value += map.get(key);
}
map.put(key,value);
}
在性能方面,它很可能不是最有效的方式,但非常简单。 Scanner
通常用于解析,但这里的解析看起来并不复杂,只是字符串的拆分。
答案 4 :(得分:0)
一种时间复杂度为O(n)的后期但干净的解决方案。该解决方案绕过了一些数组
public class Solution {
public static void main(String[] args) {
// Anagram
String str1 = "School master";
String str2 = "The classroom";
char strChar1[] = str1.replaceAll("[\\s]", "").toLowerCase().toCharArray();
char strChar2[] = str2.replaceAll("[\\s]", "").toLowerCase().toCharArray();
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
for (char c : strChar1) {
if(map.containsKey(c)){
int value=map.get(c)+1;
map.put(c, value);
}else{
map.put(c, 1);
}
}
for (char c : strChar2) {
if(map.containsKey(c)){
int value=map.get(c)-1;
map.put(c, value);
}else{
map.put(c, 1);
}
}
for (char c : map.keySet()) {
if (map.get(c) != 0) {
System.out.println("Not anagram");
}
}
System.out.println("Is anagram");
}
}
答案 5 :(得分:0)
public Map<String, Integer> mergeMaps(@NonNull final Map<String, Integer> mapOne,
@NonNull final Map<String, Integer> mapTwo) {
return Stream.of(mapOne.entrySet(), mapTwo.entrySet())
.flatMap(Collection::stream)
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, Integer::sum));
}