0

文字列を持つ単純なクラスである IndexEntry の ArrayList と、compareTo()以下に示す 2 つの整数とメソッドがあります。私の問題はCollections.sort()、ArrayList を呼び出すと、ほとんどの場合、すべてが正しく並べ替えられますが、2 つの要素が比較されず、リストが正しく並べ替えられないことがあります。

参照用のコード:

//Get a list of the values
ArrayList<IndexEntry<T>> cleanEntries = new ArrayList<IndexEntry<T>>(matches.get(query).values());

//Sort Files/URLS
Collections.sort(cleanEntries);

public int compareTo(IndexEntry<T> other) {
    if(this.occurrenceCount < other.getOccurrenceCount()){
        return 1;
    }
    else if(this.occurrenceCount > other.getOccurrenceCount()){
        return -1;
    }
    else{//Need to compare Initial Positions
        if(this.firstOccurrence == other.getFirstOccurrence()){
            return this.getLocationName().compareTo(other.getLocationName());
        }
        else if(this.firstOccurrence > other.getFirstOccurrence()){
            return 1;
        }
        else{
            return -1;
        }
    }
}   

文字「C」のすべての IndexEntry の出力例を次に示します。

c
"index.html", 6, 2
"chickadee.html", 3, 2
"cuckoo.html", 3, 2
"crow.html", 3, 2
"crane.html", 3, 2
"cardinal.html", 3, 2
"quail.html", 2, 2
"robin.html", 2, 2
"finch.html", 2, 2
"kingfisher.html", 2, 2
"swan.html", 2, 2
"turkey.html", 2, 2
"ibis.html", 2, 2
"falcon.html", 2, 2
"albatross.html", 2, 2
"tern.html", 2, 2
"dove.html", 2, 2
"mockingbird.html", 2, 2
"owl.html", 2, 2
"sparrow.html", 2, 2
"hawk.html", 2, 2
"magpie.html", 2, 2
"nighthawk.html", 2, 2
"gull.html", 2, 2
"bluebird.html", 2, 2
"raven.html", 2, 2
"blackbird.html", 2, 2
"sandpiper.html", 2, 2
"pheasant.html", 2, 2
"roadrunner.html", 2, 2
"duck.html", 2, 2
"vulture.html", 2, 2
"pigeon.html", 2, 2
"heron.html", 2, 2
"stork.html", 2, 2
"warbler.html", 2, 2
"woodpecker.html", 2, 2
"hummingbird.html", 2, 2
"mallard.html", 2, 2
"osprey.html", 2, 2
"swallow.html", 2, 2
"wren.html", 2, 2
"goose.html", 2, 2
"meadowlark.html", 2, 2
"pelican.html", 2, 2
"starling.html", 2, 2
"loon.html", 2, 2
"eagle.html", 2, 2
"puffin.html", 2, 2
"egret.html", 2, 2

出現回数と最初の出現が同じであると判断された後、並べ替えが停止することに注意してください。正しい出力は次のようになります。

c
"index.html", 6, 2
"cardinal.html", 3, 2
"chickadee.html", 3, 2
"crane.html", 3, 2
"crow.html", 3, 2
"cuckoo.html", 3, 2
"albatross.html", 2, 2
"blackbird.html", 2, 2
"bluebird.html", 2, 2
"dove.html", 2, 2
"duck.html", 2, 2
"eagle.html", 2, 2
"egret.html", 2, 2
"falcon.html", 2, 2
"finch.html", 2, 2
"goose.html", 2, 2
"gull.html", 2, 2
"hawk.html", 2, 2
"heron.html", 2, 2
"hummingbird.html", 2, 2
"ibis.html", 2, 2
"kingfisher.html", 2, 2
"loon.html", 2, 2
"magpie.html", 2, 2
"mallard.html", 2, 2
"meadowlark.html", 2, 2
"mockingbird.html", 2, 2
"nighthawk.html", 2, 2
"osprey.html", 2, 2
"owl.html", 2, 2
"pelican.html", 2, 2
"pheasant.html", 2, 2
"pigeon.html", 2, 2
"puffin.html", 2, 2
"quail.html", 2, 2
"raven.html", 2, 2
"roadrunner.html", 2, 2
"robin.html", 2, 2
"sandpiper.html", 2, 2
"sparrow.html", 2, 2
"starling.html", 2, 2
"stork.html", 2, 2
"swallow.html", 2, 2
"swan.html", 2, 2
"tern.html", 2, 2
"turkey.html", 2, 2
"vulture.html", 2, 2
"warbler.html", 2, 2
"woodpecker.html", 2, 2
"wren.html", 2, 2

とにかく、私が言ったように、私は多くの情報を省略しなければなりませんが、何か思いついたら、アイデアを本当に感謝します. ArrayList の作成後に "matches" データ構造が変更されていないことは事実です。

編集:ねえ、私はまだあなたの回答を読んでいます。迅速な対応ありがとうございました! 何人かが質問したので、これが IndexEntry クラス全体です。

    class IndexEntry<extends Comparable<T>> implements Comparable<IndexEntry<T>>{
        private T theLocation;
        private Integer occurrenceCount;
        private Integer firstOccurrence;

        public IndexEntry(T location, Integer firstOcc, Integer occCount){
            theLocation = location;
            occurrenceCount = occCount;
            firstOccurrence = firstOcc;
        }

        public int compareTo(IndexEntry<T> other) {         
            if(this.occurrenceCount < other.getOccurrenceCount()){
                return 1;
            }
            else if(this.occurrenceCount > other.getOccurrenceCount()){
                return -1;
            }
            else{//Need to compare Initial Positions
                if(this.firstOccurrence == other.getFirstOccurrence()){
                    return this.getLocationName().compareTo(other.getLocationName());
                }
                else if(this.firstOccurrence > other.getFirstOccurrence()){
                    return 1;
                }
                else{
                    return -1;
                }
            }
        }   

        public String getLocationName(){
            if(theLocation instanceof File){
                return ((File) theLocation).getAbsolutePath();
            }
            else{
                return theLocation.toString();
            }
        }

        public Integer getFirstOccurrence(){
            return firstOccurrence;
        }

        public Integer getOccurrenceCount(){
            return this.occurrenceCount;
        }

        public void addToOccurrenceCount(Integer toAdd){
            occurrenceCount += toAdd;
        }

        public void setFirstOccurrence(Integer firstOcc){
            firstOccurrence = new Integer(firstOcc);
        }
    }
4

1 に答える 1

2

あなたが示すように、あなたのコードは、あなたが主張する間違った出力ではなく、あなたが正しいとして与える出力を生成します。

これは、その自己完結型のデモンストレーションです。

https://gist.github.com/4056538

于 2012-11-11T22:33:33.453 に答える