Java HashMap:使用公共键添加值并打印出来
我有一个文件,它的字符串格式是Java HashMap:使用公共键添加值并打印出来,java,algorithm,data-structures,Java,Algorithm,Data Structures,我有一个文件,它的字符串格式是key/valuepair like people and count,例如 "Reggy, 15" "Jenny, 20" "Reggy, 4" "Jenny, 5" 在输出中,我应该根据键对所有计数值求和,所以对于我们的示例,输出是 "Reggy, 15" "Jenny, 20" "Reggy, 4" "Jenny, 5" “雷吉,19岁” “珍妮,25岁” 我的做法如下: 读取每一行,并使用扫描器和,作为分隔符获取每一行的键和计数 现在看看键在if之前是否
key/value
pair like people and count,例如
"Reggy, 15"
"Jenny, 20"
"Reggy, 4"
"Jenny, 5"
在输出中,我应该根据键对所有计数值求和,所以对于我们的示例,输出是
"Reggy, 15"
"Jenny, 20"
"Reggy, 4"
"Jenny, 5"
“雷吉,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
此外,该方法是否是最佳方法,或者是否有更有效的方法来提高性能 因为这几乎肯定是一个学习练习,所以我将远离编写代码,让您享受所有乐趣 创建一个
HashMap
。每次看到键/值对时,请检查哈希映射是否具有该键的值(使用“containsKey(key)”)。如果是,则使用get(key)
获取旧值,添加新值,然后使用put(key,newValue)
将结果存储回去。如果钥匙还不存在,请使用put
再次添加一个新钥匙。如果字符串值
(请使用Integer.valueOf(value)
),请不要忘记输出int
就优化而言,此时的任何优化都是不成熟的:它甚至不起作用!但是,很难获得比单个循环快得多的速度,这也相当简单。对于阅读,我个人使用:
Scanner.nextLine()
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));
}
}
Map Map=newhashmap();
while(scanner.hasNextLine()){
if(scanner.hasNext(“.*”){
....
if(地图容器(图例))
map.put(key,map.get(key)+Long.valueOf(value));
其他的
map.put(key,Long.valueOf(value));
}
}
拆分值的最简单方法:
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);
}
BufferedReader=newbufferedreader(newfilereader(file));
Map mapping=newhashmap();
串电流线;
while((currentLine=reader.readLine())!=null){
字符串[]对=currentLine.split(“,”);
如果(pair.length!=2){//可能不那么严格
抛出新的DataFormatException();
}
密钥=对[0];
value=Integer.parseInt(对[1]);
if(映射包含(键)){
value+=map.get(键);
}
map.put(键、值);
}
就性能而言,这很可能不是最有效的方法,但非常简单Scanner
通常用于解析,但这里的解析看起来并不复杂,只是字符串的一部分 一种时间复杂度为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");
}
}
公共类解决方案{
公共静态void main(字符串[]args){
//字谜
字符串str1=“学校校长”;
String str2=“教室”;
char strChar1[]=str1.replaceAll(“[\\s]”,“”)。toLowerCase().toCharArray();
char strChar2[]=str2.replaceAll(“[\\s]”,“”)。toLowerCase().toCharArray();
HashMap=newHashMap();
for(字符c:strChar1){
if(图c){
int value=map.get(c)+1;
map.put(c,值);
}否则{
图.put(c,1);
}
}
for(字符c:strChar2){
if(图c){
int value=map.get(c)-1;
map.put(c,值);
}否则{
图.put(c,1);
}
}
for(char c:map.keySet()){
如果(map.get(c)!=0){
System.out.println(“非字谜”);
}
}
System.out.println(“是字谜”);
}
}
公共地图合并地图(@NonNull final-Map-mapOne,
@非空最终映射(映射二){
返回Stream.of(mapOne.entrySet(),mapTwo.entrySet())
.flatMap(集合::流)
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue,Integer::sum));
}
您是否尝试过java.util.HashMap#containsKey(),put(),get()
?它是“伪代码”:-)应该拆分(“,”),因为它需要一个字符串。为什么长,当然数字看起来像年龄。不应该担心超过整数的值,比如年龄?那么这两个雷吉和珍妮就不是同一个人了:-)这是完全不同的情况。此外,看起来似乎不是一个好的参数。但是,这是正确的,应该明智地选择。我知道实现的这一部分,但我遇到的问题是在中读取键/值对数据时。@Rachel如果您使用扫描仪
读取行,然后使用split
查看演示。