1

假设我有两个 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"].

但是,我希望 ArrayListduplicateLetters存储多次输入的任何字母。因为"z"被复制了两次,所以我希望 duplicateLetters 包含["z"]and ["z"]在这个例子中。

如果可能的话,我还想跟踪每个字母被重复的次数。

我已经尝试过使用 HashSet ,它在删除列表中的重复项时非常有效(请参阅这个问题:如何从 ArrayList 中删除重复的元素?)。但是,Sets 只是简单地忽略重复项,在这种情况下,我想跟踪它们。

我在乞求想法!:/

4

4 回答 4

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);
于 2013-01-01T22:29:24.643 回答
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)");
    }
}
于 2013-01-01T22:28:42.687 回答
0

你的问题很简单。为什么不使用 java collections api 中提供的集合算法。

所以这是你需要做的:

ArrayList 字母 = new ArrayList(); // 是需要添加元素的列表

//假设您要维护一个 Map 实现以跟踪重复项:
Map dupLetters = new HashMap();

//所以编写自己的add方法如下:

public void addLetter(String letter) { int count = Collections.frequency(letters,letter);

如果(计数> 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))

}

//希望对你有帮助 !!

于 2013-03-05T16:03:51.650 回答
0

您的问题的简单解决方案。更好地使用 hashmap 来获取两个重复的字符串及其在 arraylist 中的总数:

公共静态无效主(字符串参数 [])

{

  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());
    }
}
于 2015-08-30T15:50:57.343 回答