如何在字符串排序数组中计算相同的字符串数量

3

我想要在我的String数组中统计相同单词的次数,并将这些次数打印成一个整数数组。例如:

输入:String[] s = {"be", "be", "to", "onto", "onto", "onto"}

输出:2,1,3

输入:String words[] = {"be", "be", "not", "or", "to", "to", "to"}

输出:2,1,1,3

我的代码:

    //O(n)
    public static int [] MaxNumber(String [] arr)
    {
        int [] Number_arr=new int[11];
        int count=1;
        int j=0;
        int k=0;
        for(int i = 0; i<arr.length-1; i++)
        {
            if(arr[i].equals(arr[i+1]))
                count++;
            else{
                Number_arr[j]=count;
                j++;
                count=1;
            }

        }

        return Number_arr;
    }

我的输入:String [] Sarr= {"be", "be", "not", "not", "not", "or", "to", "to", "to"};

我的输出是错误的:2,3,1

正确的输出是:2,3,1,3

我该怎么办?


您的代码计算连续相等的单词。不会计算数组中非连续的重复单词。这是您想要搜索的吗?例如,考虑数组 {"duplicate", "other", "duplicate"}。 - Davide Lorenzo MARINO
你能再检查一下正确的输出吗?在2和3之后,你想要打印1还是2? - Spartan
6个回答

4

您忘记添加最后一个相等字符串序列的计数:

for(int i = 0; i<arr.length-1; i++)
{
    if(arr[i].equals(arr[i+1]))
        count++;
    else{
        Number_arr[j]=count;
        j++;
        count=1;
    }

}
Number_arr[j]=count; // added

1
 public static int [] MaxNumber(String [] arr)
    {
        int [] Number_arr=new int[11];
        int count=1;
        int j=0;
        int k=0;
        for(int i = 0; i<arr.length-1; i++)
        {
            if(arr[i].equals(arr[i+1]))
                count++;
            else{
                Number_arr[j]=count;
                j++;
                count=1;
            }

        }

        Number_arr[j]=count;   // *added line*
        for (int i = 0; i < Number_arr.length; i++) {
            System.out.print(Number_arr[i]+"  ");
        }

        return Number_arr;
    }

最后一次出现好像没有被正确地添加。看看多出来的那行。


1

您输入的内容是:

    String [] Sarr= {"be" , "be", "not","not","not", "or","to","to","to"};

您可以看到Sarr [6] Sarr [7] Sarr [8] 的值是相同的。 假设以下值:

    i = 6; j = 3; count = 1;

现在调试你的代码,你会注意到:
    i = 7; j = 3; count = 2;
    i = 8; j = 3; count = 3;

在这个时刻,当 i = 8 时,测试条件 i<arr.length-1; 返回false,因此最新的count值将永远不会被添加到 Number_arr 中,因为 if-else 部分将不会执行。 将以下语句放在for循环的末尾,以确保最后一个count值也被添加到 Number_arr 中。
    Number_arr[j]=count;

修改后的代码是:

    public static int [] MaxNumber(String [] arr)
    {
            int [] Number_arr=new int[11];
            int count=1;
            int j=0;
            int k=0;
            for(int i = 0; i<arr.length-1; i++)
            {
                if(arr[i].equals(arr[i+1]))
                    count++;
                else
                {
                    Number_arr[j]=count;
                    j++;
                    count=1;
                }
            }
            Number_arr[j]=count;
            return Number_arr;
    }

希望这有所帮助。

0

使用Java-Stream-API的另一个简单解决方案如下:

    Stream<String> stream= Stream.of("a","a","b","c","c");
    Map<String, Long> counter = stream.collect(Collectors.groupingBy(String::new, Collectors.counting()));
    for (Entry<String, Long> count: counter.entrySet()) {
        System.out.println(count.getKey() + " : " + count.getValue());
    }

结果:

a : 2
b : 1
c : 2

0
public static int [] MaxNumber(String [] arr)
{
String [] arr={"be" , "be" , "to" , "onto","onto","onto"};
int [] Number_arr=new int[11];
int count=1;
int j=0;
int k=0;
for(int i = 0; i<arr.length-1; i++)
{
    if(arr[i].equals(arr[i+1]))
        count++;
    else{
        Number_arr[++j]=count;
        count=1;
    }
}
Number_arr[++j]=count;
return Number_arr;
}

我添加了一行代码...尽量保持你的代码不变... 希望这可以帮到你


0

你已经得到了解决处理具有连续重复单词的数组的答案。但是,你的数组中的单词总是连续的吗?如果不是,你可能需要重新考虑你的逻辑。

话虽如此,使用Java 8中的流使这变得相当简单。也许不是O(n),但它完成了工作。我们从数组中获取每个不同的单词,然后对它们进行过滤计数。

public static void main(String[] args) throws Exception {
    String [] Sarr= {"be", "be", "not", "not", "not", "or", "to", "to", "to", "be", "not"};
    Arrays.stream(Sarr).distinct()
            .forEach(word -> System.out.println(word + ": " + Arrays.stream(Sarr).filter(w -> w.equals(word)).count()));
}

结果:

be: 3
not: 4
or: 1
to: 3

如果你想将计数结果存储到数组中,可以尝试以下方法:
public static void main(String[] args) throws Exception {
    String [] Sarr= {"be", "be", "not", "not", "not", "or", "to", "to", "to", "be", "not"};
    String[] distincts = Arrays.stream(Sarr).distinct().toArray(size -> new String[size]);

    long[] wordCount = new long[distincts.length];
    for (int i = 0; i < wordCount.length; i++) {
        final String distinct = distincts[i];
        wordCount[i] = Arrays.stream(Sarr).filter(word -> word.equals(distinct)).count();
    }
    System.out.println(Arrays.toString(wordCount));
}

结果:

[3, 4, 1, 3]

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