0

「items」という配列のインデックスを検索して、同じ文字列が複数のインデックスに含まれているかどうかを確認するメソッドを作成しようとしています(大文字と小文字は区別されません)。文字列が配列内に複数回存在する場合、メソッドはメッセージを出力して終了する必要があります。私が今持っているものでは、ループが機能することもあれば、機能しないこともあります。たとえば、文字列「house」と「hOuse」が格納されている場合、ループはキャッチされません。最初は休憩しました。見つかった後=true; 削除すると役立つかもしれないと思いましたが、そうではありませんでした。何かアドバイス?

public void equals() {
    boolean found = false;
    for (int i = 0; i < items.length; i++) {
        for (int j = 1; j > i && j < items.length; j++) {
            if (items[i].equalsIgnoreCase(items[j])) {
                found = true;
            }
        }
    }
    if (found) {
        System.out.println("You listed the same item more than once.  Please restart and try again.");
        System.exit(0);
    }
}
4

2 に答える 2

1

これがあなたの問題です

    for (int i = 0; i < items.length; i++) {
        for (int j = 1; j > i && j < items.length; j++) {

に変更します

    for (int i = 0; i < items.length; i++) {
        for (int j = i+1; j > i && j < items.length; j++) {

理由: i が 2 で j が 1 の場合、j はすぐに > 1 ではなくなり、内側のループはすぐに戻ります。これは、配列の最初の文字列に対してのみ比較が行われることを意味するため、明らかに望んでいるものではありません。

そしてもちろん、j は常に > i なので、チェックを外すことができます:

    for (int i = 0; i < items.length; i++) {
        for (int j = i+1; j < items.length; j++) {

ずっといい。

ちなみに、すべての文字列をHashSet<String>http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html)に追加し、長さをチェックすることで、アルゴリズムを本当に高速にすることができますHashSet と元のコレクションの長さの差 - 低い場合は、重複がありました。これは O(n^2) ではなく O(nlog(n)) で実行されます

于 2013-03-17T22:50:12.500 に答える
1

変更する必要があります:

for (int j = 1; j > i && j < items.length; j++)

for (int j = i + 1; j < items.length; j++)

そのメソッドを記述するための短くて簡単な方法は次のとおりです。

public void equals() {
    Set<String> set = new TreeSet<String> (String.CASE_INSENSITIVE_ORDER);
    set.addAll(Arrays.asList(items));
    if (set.size() != items.length) {
        System.out.println("You listed the same item more than once.  Please restart and try again.");
    }
}

最後に、メソッドを再利用可能にするために、次のように記述できます。

public boolean hasDuplicatesIgnoreCase(String[] items) {
    ...
    return true / false;
}
于 2013-03-17T22:51:01.243 に答える