我正在尝试创建一个程序来计算String []数组中所有字符串中出现的常见元素。我有以下内容: -
master 数组和 flag 数组,大小均为26
现在为每个字符串:我为字符串中出现的每个字符标记频率1,而不在 flag 数组中递增。
现在我将flag数组的值添加到master数组的相应值
我的代码看起来像这样
-stdlib=libc++
我的计划是最终计算主数组中值等于输入字符串数组长度的元素。 此计数将表示所有字符串共有的字符数
但是我的代码存在缺陷。
如果一个String有重复的元素,例如,' ball' (2升)。 master 数组中元素的相应值将再次递增。 这使得它的价值大于我想要的价值。
所以这就是我所做的。
for(String str : arr)
{
for(char ch : str.toCharArray())
{
flag[ch - 97] = 1;
master[ch - 97] =master[ch -97] + flag[ch - 97];
}
}
这是正确的做法吗?或者这个代码可以更优化?
答案 0 :(得分:0)
恕我直言 - "正确的做法"是一个你完全理解并可以随意重构的人。通常总有多种方法可以解决任何编程问题。就个人而言,我会接近(我认为)你试图以更符合Java的方式解决的问题。
对于要检查的整个字符串数组,您检查的第一个字符串中的每个字符都在目前为止检查的每个字符串中,因此第一个字符串中的每个字符都将进入Map<Character, Integer>
即{{ 1}}对于第二个字符串和之后的每个字符串:如果正在检查的字符串中的字符位于映射的keySet中,则递增关联的Integer(增加该键的关联值){{1} }。在检查每个字符串中的每个字符之后,键集中映射到具有与原始字符串数组长度匹配的值的整数的键正好是在每个字符串中找到的字符。
到目前为止,这个提议的解决方案并没有解决您在上面描述的重复字符问题。为了解决这个问题,我认为你需要保留一个单独的独特字符列表&#34;到目前为止看到&#34;在#34;正在检查的字符串中#34; (并清空每个新字符串的列表)。你会检查到目前为止看到的&#34;&#34;首先列出,并跳过该角色的所有进一步处理,如果在&#34;到目前为止看到&#34;,只有到目前为止看不到的字符&#34; (在此正在检查的字符串中)将根据地图的键集进行检查。 example code
还有一种递归的方法来编写解决这个问题的方法,但是我会把这个问题留下来......