2013-01-01 126 views
1

假设我有两个ArrayList对象。用户将输入一些字母,但在这个例子中,我只是将一些字母硬编码到一个ArrayList以使生活更轻松。这似乎是一个简单的问题,但我很困惑它!将重复值从一个ArrayList移动​​到另一个ArrayList(Java)

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"被复制了两次,所以在此示例中,我希望复本信息包含["z"]["z"]

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

我已经尝试过使用HashSet,它在删除列表中的重复项时非常有效地工作(请参阅此问题:How do I remove repeated elements from ArrayList?)。但是,集只是简单地忽略重复,在这种情况下,我想跟踪它们。

我在求求意见! :/

回答

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); 
+0

虽然duplicateLetters将不包含“Z”两次这里,只有一次。 – rednaxela

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)"); 
    } 
} 
0

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

因此,这里是你需要做什么:

ArrayList的字母=新的ArrayList(); //在这里你需要添加元素

//假设你要保持一个Map实现跟踪重复的名单:
地图dupLetters =新的HashMap();

公共无效addLetter(串号){ INT 数=类别:

//如下所以写你自己的add方法。频率(字母,字母);

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

}

//希望这将帮助你!

0

简单的解决你的问题。更好地使用HashMap来与他们的总数同时获得重复字符串数组列表:

公共静态无效的主要(字符串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()); 
    } 
} 
相关问题