假设我有两个ArrayList对象。用户将输入一些字母,但在此示例中,我将仅将一些字母硬编码到ArrayList以使生活更轻松。这似乎是一个简单的问题,但我对此感到困惑!
ArrayList<String> letters = new ArrayList<String>();
ArrayList<String> duplicateLetters = new ArrayList<String>();
letters.add("z");
letters.add("a");
letters.add("z");
letters.add("z");
letters.add("b");
我的目标是从ArrayList letters
中删除重复项,因此最终只会包含["z"], ["a"] and ["b"]
。
但是,我希望ArrayList duplicateLetters
存储多次输入的任何字母。由于"z"
重复了两次,因此我希望duplicateLetters在此示例中包含["z"]
和["z"]
。
如果可能的话,我还想跟踪每个字母重复的次数。
我已经尝试过使用HashSet,它在删除List中的重复项时非常有效(请参阅此问题:How do I remove repeated elements from ArrayList?)。但是,Set只是忽略重复,在这种情况下,我想跟踪它们。
我在乞求创意! :/
答案 0 :(得分:2)
为什么不保持将字母映射到频率的Map
。每次用户输入一个字母时,您都会更新此地图:
Map<String, Integer> map = new HashMap<String, Integer>();
if (map.containsKey(input)) {
map.put(input, map.get(input) + 1);
} else {
map.put(input, 1);
}
要创建letters
,您将拥有:
List<String> letters = new ArrayList<String>(map.keySet());
要创建duplicateLetters
,您可以循环使用密钥,只添加值大于1
的密钥:
List<String> duplicateLetters = new ArrayList<String>();
for (String key : map.keySet())
if (map.get(key) > 1)
duplicateLetters.add(key);
答案 1 :(得分:0)
这样可行,我不确定效率是否高,但我认为没问题。 它将所有字母移动到newLetters或duplicateLetters。
public static void main(String[] args) {
ArrayList<String> letters = new ArrayList<String>();
HashMap<String, Integer> duplicateLetters = new HashMap<String, Integer>();
ArrayList<String> newLetters = new ArrayList<String>();
letters.add("z");
letters.add("a");
letters.add("z");
letters.add("z");
letters.add("b");
Iterator<String> iterator = letters.iterator();
while (iterator.hasNext()) {
String next = iterator.next();
if (newLetters.contains(next)) {
Integer value = duplicateLetters.get(next);
if (value == null) {
duplicateLetters.put(next, 1);
}
else {
duplicateLetters.put(next, value + 1);
}
}
else {
newLetters.add(next);
}
}
letters = newLetters;
for (String letter : letters) {
System.out.println("these are left: " + letter);
}
for (Map.Entry<String, Integer> entry : duplicateLetters.entrySet()) {
System.out.println(entry.getKey() + " was duplicated " + entry.getValue()+ " time(s)");
}
}
答案 2 :(得分:0)
你的问题非常简单。为什么不使用java collections api中提供的集合算法。
所以这就是你需要做的事情:
ArrayList letters = new ArrayList(); //是您需要添加元素的列表
//假设您要维护Map实现以跟踪重复项: 映射dupLetters = new HashMap();
//所以编写自己的add方法如下:
public void addLetter(String letter) { int count = Collections.frequency(字母,字母);
if(count> 0)
{
int letterFreq = 0;
//This entry is a duplicate so don't add this one to list; put it in the map
if(dupLetters.containsKey(letter))
{
letterFreq = dupLetters.get(letter);
}
dupLetters.put(letter,(letterFreq+1))
}
//希望这会对你有帮助!!
答案 3 :(得分:0)
解决您问题的简单方法。最好使用hashmap来获取重复字符串及其在arraylist中的总计数:
public static void main(String args [])
{
ArrayList<String> al=new ArrayList<String>();
HashMap<String,Integer> ht=new HashMap<String,Integer>();
al.add("a");
al.add("z");
al.add("z");
al.add("b");
al.add("a");
al.add("t");
al.add("t");
int ct=0;
for(String i : al)
{
for(String j : al)
{
if(i.equals(j))
{
ct++;
}
}
if(ct>1)
{
ht.put(i, ct);
} ct=0;
}
for(Entry g:ht.entrySet())
{
System.out.println(g.getKey()+" "+g.getValue());
}
}