6

つまり、簡単に言うと、Javaの宿題があり、文字列の長いArrayListをさまざまな方法で操作する必要があります(単語の組み合わせの表示、ArrayListの追加と削除など、特別なことは何もしていません)。提供されたArrayListのいくつかに重複するエントリがあることに気づきました(この割り当てには重複は必要ありません)。そのため、教師から重複するエントリを削除してデータをサニタイズすることができました。これが私が思いついたものです:

private static ArrayList<String> KillDups(ArrayList<String> ListOfStrings) {  

    for (int i = 0 ; i < ListOfStrings.size(); i++) {
        for (int j = i + 1; j < ListOfStrings.size(); j++) {
            //don't start on the same word or you'll eliminate it.
            if ( ListOfStrings.get(i).toString().equalsIgnoreCase( ListOfStrings.get(j).toString() )  ) {
                ListOfStrings.remove(j);//if they are the same, DITCH ONE.
                j = j -1; //removing the word basically changes the index, so swing down one.
            }                                
        }
    }
    return ListOfStrings;
}

これは私の任務には問題ありませんが、現実の世界で非常に役立つとは思えません。比較中に空白や特殊文字を無視する方法はありますか?これを処理するためのよりクリーンな方法はありますか(おそらくネストされたForループなしで)?私が尋ねるべきわからない別の質問がありますか?

4

6 に答える 6

19

はい。そしてそれはたった1つの(エレガントな)行で行うことができます:

List<String> noDups = new ArrayList<String>(new LinkedHashSet<String>(list));

中間体Setは重複がないことを保証します。のLinkedHashSet実装はSet、リストの順序を維持するために選択されました。


また、スタイルノートについて:

  • メソッドとパラメーターに小文字で始まる名前を付けます
  • メソッドシグネチャを指定するときは、常に具象(ie List)ではなく抽象(ie)を参照してくださいArrayList

その場合、全体の方法は次のようになります。

private static List<String> killDups(List<String> list) {
    return new ArrayList<String>(new LinkedHashSet<String>(list));
}

余分なブラウニーポイントについては、メソッドをジェネリックにするので、どのタイプのList:でも機能します。

private static <T> List<T> killDups(List<T> list) {
    return new ArrayList<T>(new LinkedHashSet<T>(list));
}

特定の文字を無視したい場合は、そのためのクラスを作成し、それらのリストを作成します。hashCode()とメソッドの両方が、重複を削除するためequals()に依存しています。HashSets

public class MungedString {
    // simplified code
    String s;

    public boolean equals(Object o) {
        // implement how you want to compare them here
    }

    public int hashCode() {
        // keep this consistent with equals()
    }
}

それから

List<MungedString> list;
List<MungedString> noDupList = killDups(list);
于 2012-11-12T01:30:42.187 に答える
2

使用を検討してくださいSet

文字列を直接比較する最も単純なケースでは、を使用すると次のHashsetようになります。

Set<String> mySet = new HashSet<String>();

mySet.addAll(aListWithDuplciatedStrings);

次に、中mySetには一意の文字列のセットが含まれます。

無視する場合の比較のために、それは私があなたに残した宿題です。見てTreeSetComparator

于 2012-11-12T01:33:55.080 に答える
1

ArrayListの代わりにHashSetを使用できます。重複を自動的に破棄するコンテナです。挿入されたアイテムが重複しているかどうかの判断は、セットのサイズに関係なく、一定時間の操作です。したがって、ArrayListをHashSetに変換して元に戻すと、すべての重複が削除されます。

欠点は、HashSetの順序が予測できないことです。そのため、順序を維持することが重要な場合は、代わりにLinkedHashSetを使用してください(少し遅くなります)。

于 2012-11-12T01:32:17.043 に答える
1

まず、:を使って気の利いたワンライナーでそれを行うことができますSet

private static ArrayList<String> KillDups(ArrayList<String> ListOfStrings) {
    return new ArrayList(new LinkedHashSet(ListOfStrings));
}

これにより、すべての重複が削除されます。ループの2番目のオプションは、それらを新しいList:に追加することです。

private static ArrayList<String> KillDups(ArrayList<String> ListOfStrings) {
    ArrayList<String> newList = new ArrayList<String>();
    for(String s : ListOfStrings) {
        if(!newList.contains(s)) {
            newList.add(s);
        }
    }
    return newList
}

カスタム比較について。コンパレータを提供できるセットがあると思いますが、現時点では思い出せません。

于 2012-11-12T01:38:12.527 に答える
0
import java.awt.Toolkit;
import java.util.Scanner;

class duplicate {

 public static void main(String[] args) {  

    Scanner kb = new Scanner(System. in );
    System.out.println("Entre String");
    String string = kb.nextLine();


    int length = string.length();
    if(length < 2) {
        System.out.println(string);
        return;
    }

    System.out.print(string.charAt(0));
    for (int i = 1; i < length; i++) {
        if (string.charAt(i) != string.charAt(i - 1)) {
            System.out.print(string.charAt(i));
          } 
    }
}
}
于 2013-09-30T09:28:45.890 に答える
0
public static void removeDuplicateString(String input) {
    String value1 = manikandan;
    String value2 = manikandan;
    String finalValue = "";
    int count = 0;
    char char1;
    char char2 = 0;
    for (int i = 0; i < value1.length(); i++) {
        flag = 0;
        char1 = value1.charAt(i);
        for (int j = 0; j < value2.length(); j++) {
            char2 = value2.charAt(j);
            if (char1 == char2) {
                count++;
            }
        }

        if (count > 1) {
            finalValue=finalValue+char1;
            i=i+(count-1);
        } else {
            finalValue = finalValue + char1;
        }
        count = 0;
    }
    System.out.println(finalValue);
}

}

于 2013-09-30T09:40:56.480 に答える