删除重复元素并计算 ArrayList 中的重复次数
Removing duplicate elements & count repetitions in ArrayList
这比我想象的要难。我有一个排序的字符串(单词)ArrayList,我的任务是删除重复项并打印出每个单词的列表,然后是单词的重复次数。我只想说它比我预期的要复杂。在尝试了不同的东西之后,我决定使用 HashMap 来存储单词 (key),value(repetitions)。
这是代码。 Dictionary就是排序后的ArrayList和HashMap的Repetitions。
public void countElements ()
{
String word=dictionary.get(0);
int wordCount=1;
int count=dictionary.size();
for (int i=0;i<count;i++)
{
word=dictionary.get(i);
for (int j=i+1; j<count;j++)
{
if(word.equals(dictionary.get(j)))
{
wordCount=wordCount+1;
repetitions.put(word, wordCount);
dictionary.remove(j--);
count--;
}
}
}
出于某种我不明白的原因(我是初学者),在我调用dictionary.remove(j--)方法后,变量j减1,即使它应该是i+ 1.我错过了什么?任何有关如何正确执行此操作的想法将不胜感激。我知道最好使用迭代器,但这会变得更加混乱。
非常感谢。
此代码将为您服务。现在字典将包含唯一的单词,哈希图将包含每个单词的频率计数。
public class newq {
public static void main(String[] args)
{
ArrayList<String> dictionary=new ArrayList<String>();
dictionary.add("hello");
dictionary.add("hello");
dictionary.add("asd");
dictionary.add("qwet");
dictionary.add("qwet");
HashMap<String,Integer> hs=new HashMap<String,Integer>();
int i=0;
while(i<dictionary.size())
{
String word=dictionary.get(i);
if(hs.containsKey(word)) // check if word repeated
{
hs.put(word, hs.get(word)+1); //if repeated increase the count
dictionary.remove(i); // remove the word
}
else
{
hs.put(word, 1); //not repeated
i++;
}
}
Iterator it = hs.entrySet().iterator();
while(it.hasNext())
{
HashMap.Entry pair = (HashMap.Entry)it.next();
System.out.println(pair.getKey() + " = " + pair.getValue());
it.remove();
}
for(String word: dictionary)
{
System.out.println(word);
}
}
}
使用流的版本:
final Map<String, Long> countMap = dictionary.stream().collect(
Collectors.groupingBy(word -> word, LinkedHashMap::new, Collectors.counting()));
System.out.println("Counts follow");
System.out.println(countMap);
System.out.println("Duplicate-free list follows");
System.out.println(countMap.keySet());
在这里,我们使用每个元素(即每个单词)作为结果映射中的键对列表的元素进行分组(使用 Collectors.groupingBy
),并计算该单词的出现次数(使用 Collectors.counting()
) .
外部收集器 (groupingBy
) 使用 counting
收集器作为下游收集器,收集(此处为统计)单个单词的所有出现次数。
我们在这里使用 LinkedHashMap
来构建地图,因为它维护了向其中添加键值对的顺序,因为我们希望维护单词在初始列表中的相同顺序。
还有一件事:countMap.keySet()
不是 List
。如果你想最后得到一个List
,那就是new ArrayList(countMap.keySet())
.
如果您不想 'j' 递减,您应该使用 j-1。
使用 j--、--j、j++ 或 ++j 更改变量的值。
This link 有关于 post- en pre-incrementing 的很好的解释和简单的例子。
这比我想象的要难。我有一个排序的字符串(单词)ArrayList,我的任务是删除重复项并打印出每个单词的列表,然后是单词的重复次数。我只想说它比我预期的要复杂。在尝试了不同的东西之后,我决定使用 HashMap 来存储单词 (key),value(repetitions)。
这是代码。 Dictionary就是排序后的ArrayList和HashMap的Repetitions。
public void countElements ()
{
String word=dictionary.get(0);
int wordCount=1;
int count=dictionary.size();
for (int i=0;i<count;i++)
{
word=dictionary.get(i);
for (int j=i+1; j<count;j++)
{
if(word.equals(dictionary.get(j)))
{
wordCount=wordCount+1;
repetitions.put(word, wordCount);
dictionary.remove(j--);
count--;
}
}
}
出于某种我不明白的原因(我是初学者),在我调用dictionary.remove(j--)方法后,变量j减1,即使它应该是i+ 1.我错过了什么?任何有关如何正确执行此操作的想法将不胜感激。我知道最好使用迭代器,但这会变得更加混乱。 非常感谢。
此代码将为您服务。现在字典将包含唯一的单词,哈希图将包含每个单词的频率计数。
public class newq {
public static void main(String[] args)
{
ArrayList<String> dictionary=new ArrayList<String>();
dictionary.add("hello");
dictionary.add("hello");
dictionary.add("asd");
dictionary.add("qwet");
dictionary.add("qwet");
HashMap<String,Integer> hs=new HashMap<String,Integer>();
int i=0;
while(i<dictionary.size())
{
String word=dictionary.get(i);
if(hs.containsKey(word)) // check if word repeated
{
hs.put(word, hs.get(word)+1); //if repeated increase the count
dictionary.remove(i); // remove the word
}
else
{
hs.put(word, 1); //not repeated
i++;
}
}
Iterator it = hs.entrySet().iterator();
while(it.hasNext())
{
HashMap.Entry pair = (HashMap.Entry)it.next();
System.out.println(pair.getKey() + " = " + pair.getValue());
it.remove();
}
for(String word: dictionary)
{
System.out.println(word);
}
}
}
使用流的版本:
final Map<String, Long> countMap = dictionary.stream().collect(
Collectors.groupingBy(word -> word, LinkedHashMap::new, Collectors.counting()));
System.out.println("Counts follow");
System.out.println(countMap);
System.out.println("Duplicate-free list follows");
System.out.println(countMap.keySet());
在这里,我们使用每个元素(即每个单词)作为结果映射中的键对列表的元素进行分组(使用 Collectors.groupingBy
),并计算该单词的出现次数(使用 Collectors.counting()
) .
外部收集器 (groupingBy
) 使用 counting
收集器作为下游收集器,收集(此处为统计)单个单词的所有出现次数。
我们在这里使用 LinkedHashMap
来构建地图,因为它维护了向其中添加键值对的顺序,因为我们希望维护单词在初始列表中的相同顺序。
还有一件事:countMap.keySet()
不是 List
。如果你想最后得到一个List
,那就是new ArrayList(countMap.keySet())
.
如果您不想 'j' 递减,您应该使用 j-1。 使用 j--、--j、j++ 或 ++j 更改变量的值。
This link 有关于 post- en pre-incrementing 的很好的解释和简单的例子。