1

2 つの 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"]

duplicateLettersただし、複数回入力された文字をArrayListに格納する必要があります。は 2 回複製されているため、この例では duplicateLetters にand "z"を含めたいと考えています。["z"]["z"]

可能であれば、各文字が複製された回数も追跡したいと思います.

リスト内の重複を削除するときに非常に効果的に機能する HashSet を使用してみました (この質問を参照してください: ArrayList から繰り返し要素を削除するにはどうすればよいですか? )。ただし、セットは単に重複を無視するだけなので、この場合はそれらを追跡したいと考えています。

アイデア募集中です!:/

4

4 に答える 4

2

Map文字を周波数にマッピングする a を維持してみませんか。ユーザーが文字を入力するたびに、このマップを更新します。

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

あなたの質問はとても簡単です。javacollectionsapiで提供されているcollectionsアルゴリズムを使用してみませんか。

だからここにあなたがする必要があることです:

ArrayList文字=newArrayList(); //要素を追加する必要があるリストです

//重複を追跡するためにMap実装を維持したいと仮定します:
Map dupLetters = new HashMap();

//したがって、次のように独自のaddメソッドを記述します。

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

if(カウント> 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

これは機能します。非常に効率的かどうかはわかりませんが、問題ないと思います。すべての文字を 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

あなたの問題に対する簡単な解決策。ハッシュマップを使用して、繰り返し文字列と配列リストの合計数の両方を取得することをお勧めします。

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