繁体   English   中英

计算字符串数组中的公共元素

[英]Counting Common Elements in a String Array

我正在尝试制作一个程序来计算在String []数组的所有Strings中出现的公共元素。 我有以下内容:

大小均为26的数组和标志数组

现在为每个字符串:我为出现在字符串中的每个字符标记频率1,而不会在标志数组中增加。

现在我将标志数组的值添加到主数组的相应值

我的代码看起来像这样

for(String str : arr)
{
    for(char ch : str.toCharArray())
    {
        flag[ch - 97] = 1;
        master[ch - 97] =master[ch -97] + flag[ch - 97];
    }
}

我的计划是最终计算主数组中值等于输入字符串数组长度的元素。 此计数将代表所有字符串共有的字符数

但是我的代码有缺陷。

如果字符串具有重复的元素,例如'ball'(带有2 ls)。 数组中元素的对应值将再次递增。 这使其价值比我想要的更大。

这就是我所做的。

for(String str : arr)
{
    newstr = "";  //to keep track of each character in the string

    for(char ch : str.toCharArray())
    {
        int counter = 0;
        for(int i = 0; i < newstr.length();i++)
        {
            char ch2 = newstr.charAt(i);
                if (ch == ch2 )
                {
                    counter = counter + 1; //if duplicate
                    break;
                }
        }

    if(counter == 1)
    {
        break;
    }
    flag[ch - 97] = 1;
    master[ch - 97] =master[ch -97] + flag[ch - 97];
    newstr = newstr + ch;

   }
}

这是正确的方法吗? 还是可以对此代码进行更优化?

恕我直言-“正确的方法”是一种您完全理解并可以随意重构的方法。 通常总是有多种方法来解决任何编程问题。 就我个人而言,我将以一种对Java更具意识形态的方式来解决(我认为是)您要解决的问题。

对于要检查的整个字符串数组,到目前为止,您检查的第一个字符串中的每个字符都在每个检查的字符串中,因此,第一个字符串中的每个字符都将放入Map<Character, Integer>charCountMap.put(aChar, 1)对于第二个字符串及其后的每个字符串:如果正在检查的字符串中的一个字符位于地图的keySet中,则增加关联的Integer(增加该键的关联值) charCountMap.get(aChar)++ 检查每个字符串中的每个字符之后,键集中映射到Integers且其值与原始字符串数组的长度匹配的键就是在每个字符串中找到的字符。

到目前为止,此提议的解决方案不能解决您上面描述的重复字符问题。 为了解决这一部分,我认为您需要在“正在检查的字符串”中保留一个单独的“到目前为止已看到”的唯一字符列表(并为每个新字符串清空该列表)。 您将首先检查“目前为止已看到”列表,如果在“目前为止已看到”中找到该字符,则跳过对该字符的所有进一步处理,只有未“目前为止已看到”的字符(在检查中的字符串中)才会根据地图的键集。 示例代码

还有一种递归方法可以为这个问题编程解决方案,但是我将把成果保留得很低...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM