我必须计算包含字符串和整数的String
中每个ArrayList
的出现次数。现在我必须忽略与每个项目的数量相对应的int
变量,并且只计算该列表中每个String的重复次数。
我的问题是,在课堂上我们只用整数做了这个。现在使用字符串我的外壳有问题,因为“abc”与“Abc”不同,“def of Ghi”与“Def of ghi”不同。
现在我的代码是:
Map<String, Integer> getCount1 = new HashMap<>();
{
for (ItemsList i : list) {
Integer count = getCount1.get(i.name);
if (count == null) {
count = 0;
}
getCount1.put(i.name, (count.intValue() + 1));
}
for (Map.Entry<String, Integer> entry : getCount1.entrySet())
f.println(entry.getKey() + " : " + entry.getValue());
}
但正如我所说:它没有正确计算出现次数。例如,我在我的列表中出现了一个名为“abc of abc”的事件,然后在input.txt文件列表中我有同样的事件4次 - “Abc of abc”; “abc of Abc”; “Abc of Abc”和“abc of abc” - 所有的写法都不同,并且它们分别计算它们而不是相同的次数4次。
早在我处理总数和平均值时,我能够使用equalsIgnoreCase()
所以它在那里工作得很好,所以无论外壳如何,它都在正确的列表中计算它们但不仅仅是一次出现好几次。
在计算它们之前,有没有办法可以使用忽略大小写或将所有内容转换为相同的大小写?
只是更新:我没有尝试.toLowerCase()
,而是在FileReader
读取.txt文件时使用它i.name = name.toLowerCase();
< / p>
感谢您的时间和帮助
答案 0 :(得分:3)
试试这个:
public void getCount(){
Map<String, Integer> countMap = new HashMap<String, Integer>();
for(ItemsList i : itemsList){
if(countMap.containsKey(i.Name.toLowerCase())){
countMap.get(i.Name.toLowerCase())++;
}
else{
countMap.put(i.Name.toLowerCase(),1);
}
}
}
答案 1 :(得分:1)
HashMap的hashing function区分大小写,因此您需要大写或小写字符串值。请参阅下面的修改后的代码:
Map<String, Integer> getCount1 = new HashMap<>();
{
for (ItemsList i : list) {
Integer count = getCount1.get(i.name);
if (count == null) {
count = 0;
}
getCount1.put(i.name.toString(). toLowerCase() , (count.intValue() + 1));
}
for (Map.Entry<String, Integer> entry : getCount1.entrySet())
f.println(entry.getKey() + " : " + entry.getValue());
}
作为一种风格,我会对ItemsList中的项目使用更具描述性的名称,例如item
。
答案 2 :(得分:1)
我没有尝试.toLowerCase()
,而是在FileReader
读取.txt文件时使用它i.name = name.toLowerCase();
所以最后我的代码是这样的:
static void readFile(ArrayList<Items> list) throws IOException {
BufferedReader in = new BufferedReader(
new FileReader("input.txt")
);
String text;
while( (text = in.readLine()) != null ) {
if(text.length()==0) break;
Scanner line = new Scanner(text);
linha.useDelimiter("\\s*:\\s*");
String name = line.next();
int qtt = line.nextInt();
Items i = new Items();
i.name = name.toLowerCase();
i.qtt = qtt;
list.add(i);
}
in.close();
}