将重复值从一个ArrayList移动​​到另一个ArrayList(Java)

时间:2013-01-01 22:19:49

标签: java arraylist

假设我有两个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只是忽略重复,在这种情况下,我想跟踪它们。

我在乞求创意! :/

4 个答案:

答案 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());
    }
}