0

二分探索を使用して、部分文字列を含む文字列を検索しようとしています。

ArrayList<String> ch = new ArrayList<String>();
    ch.add("qwerty");
    ch.add("asdfghjkl");
    ch.add("c");
    ch.add("d");
    ch.add("e");
    Comparator<String> comparator = new Comparator<String>() {
        public int compare(String node1, String node2) {
            if (node1.contains(node2)) {
                return 0;
            }
            return node1.indexOf(node2);
        }
    };


    int pos2 = Collections.binarySearch(ch, "sdf", comparator);

ループを使用する代わりにバイナリサーチを使用することは可能ですか? これは私に間違ったインデックスを与えています。

x と y が固定値である string.substring(x,y) の使用を避けようとしています。

4

4 に答える 4

2

Collections.binarySearchmethod は、部分文字列やメソッドに基づく一致ではなく、完全一致を検索するために使用されます。また、 forを機能させるには、メソッドに渡すものbinarySearchに基づいて、並べ替えられた配列が必要です(ただし、これも機能しないため、ここでは問題ではありません)。ComparatorbinarySearch

ループを使用する代わりにバイナリサーチを使用することは可能ですか?

ループを使わずにこれを行うことは不可能だと思います。パフォーマンスが本当に心配な場合は、独自の二分探索の実装を作成してcontains()、同等性ではなくチェックすることができます。

于 2013-10-16T17:55:28.953 に答える
0

API で説明されているように、項目を検索する前にリストをソートする必要があります。

http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#binarySearch(java.util.List , T)

また、compare 関数は応答として -1,0,1 を返す必要があり、本来の動作をしていないように見えます。

于 2013-10-16T17:58:28.373 に答える