在ArrayList中计算一个给定字符串的出现次数

5

我有一个字符串列表,我遍历它并计算出现"x"字符串的数量,但计数没有给我预期的值:

ArrayList<Integer> list = new ArrayList<Integer>();

List<String> strings = table.getValue(); //this gives  ["y","z","d","x","x","d"]

int count = 0;
for (int i = 0; i < strings.size(); i++) {
    if ((strings.get(i) == "x")) {
        count++;
        list.add(count);
    }
}

System.out.println(list);

这里给出的[]应该是2,因为我有两个"x"出现了。


1
不要使用==比较字符串,应该使用equals() - flash
你为什么要使用ArrayList来计数? - Bala R
3
如果Java编译器在字符串的==比较上发出警告,那么Stack Overflow的流量会减少多少,我很好奇... - NPE
好的,我已经改成了等于号,现在的问题是它打印出了 [1,2] 而不是 [2]? - lola
5个回答

13

已经存在一个适用于此的现有方法

Collections.frequency(collection, object);

在您的情况下,请使用以下方式(用此替换您发布的所有代码):
System.out.println(java.util.Collections.frequency(table.getValue(), "x"));

可以的,就像你提到的那样,我们可以直接使用集合。 - lola
@Iola:是的,它是一个静态方法,这就是你使用它的方式。 - JRL

4

在比较字符串时应该使用equals而不是==。例如,将下面的代码进行更改:

if ((list.get(i) == "x"))
                 ^^

to

if ((list.get(i).equals("x")))
                 ^^^^^^

==比较引用,而.equals比较字符串的实际内容。


相关问题:


好的,我已经改成了等于号,现在的问题是它打印出了 [1,2] 而不是 [2]? - lola
这是因为每次增加count时,您都将其添加到列表中。要么只打印count而不是list,要么在再次添加之前从list中删除先前的count - aioobe

1

您需要使用:

list.get(i).equals("x");

!= / == 只检查引用。

我不知道为什么你要使用 ArrayList 进行计数。你可能需要像这样的东西:

int count = 0;
for (String s : table.getValue()) {
    if (s.equals("x")) {
        count++;
    }
}
System.out.println( count );

我需要一个数组列表,因为getValue方法会返回一个数组列表。 - lola

0

对于字符串,您应该使用equals方法。

int ct = 0;
for (String str : table.getValue()) {
    if ("x".equals(str)) { // "x".equals to avoid NullPoniterException
        count++;
    }
}
System.out.println(ct);

0

既然你需要查找元素并获取大小,我建议使用Guava的Iterables.filter方法。

List<String> filtered = Lists.newArrayList(
                     Iterables.filter(myList, 
                                      Predicates.equalTo("x")));
int count = filtered.size();

但正如其他人指出的那样,你的代码无法工作的原因是==


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接