使用不区分大小写的比较计算arraylist中字符串的出现次数

时间:2014-01-20 12:36:28

标签: java string arraylist case-insensitive

我必须计算包含字符串和整数的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>

感谢您的时间和帮助

3 个答案:

答案 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();            
}