Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Collections.sort()不比较元素_Java_Sorting_Collections - Fatal编程技术网

Java Collections.sort()不比较元素

Java Collections.sort()不比较元素,java,sorting,collections,Java,Sorting,Collections,我有一个IndexEntry的ArrayList,它是一个简单的类,包含一个字符串、两个整数和一个compareTo()方法,如下所示。我的问题是,当我在ArrayList上调用Collections.sort()时,大多数情况下所有内容都排序正确,但有时两个元素永远不会进行比较,从而导致列表排序错误 一些代码供参考: //Get a list of the values ArrayList<IndexEntry<T>> cleanEntries = new ArrayL

我有一个IndexEntry的ArrayList,它是一个简单的类,包含一个字符串、两个整数和一个
compareTo()
方法,如下所示。我的问题是,当我在ArrayList上调用
Collections.sort()
时,大多数情况下所有内容都排序正确,但有时两个元素永远不会进行比较,从而导致列表排序错误

一些代码供参考:

//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
"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);
        }
    }
class IndexEntry实现了可比较的{
私人场所;
私有整数发生计数;
私有整数优先发生;
公共索引中心(T位置、整数优先OCC、整数occCount){
位置=位置;
发生计数=OCAccount;
firstOccurrence=firstOcc;
}
公共int比较(索引输入其他){
if(this.occurrenceCountother.getOccurrenceCount()){
返回-1;
}
否则{//需要比较初始位置
if(this.firstOccurrence==other.getFirstOccurrence()){
返回这个.getLocationName().compareTo(other.getLocationName());
}
else if(this.firstOccurrence>other.getFirstOccurrence()){
返回1;
}
否则{
返回-1;
}
}
}   
公共字符串getLocationName(){
if(文件的位置实例){
返回((文件)位置).getAbsolutePath();
}
否则{
返回location.toString();
}
}
公共整数getFirstOccurrence(){
返回第一个事件;
}
公共整数getOccurrenceCount(){
返回此.occurrenceCount;
}
public void addToOccurrenceCount(整数toAdd){
发生计数+=toAdd;
}
public void setFirstOccurrence(整数firstOcc){
firstOccurrence=新整数(firstOcc);
}
}

您的代码,正如您所展示的,会产生正确的输出,而不是您声称的不正确的输出

这是一个完整的演示:


在您的输出中,3个“字段”是否对应于locationName、occurenceCount和FirstOccurrence(按顺序)?除非我忽略了什么,否则您的
compareTo()
方法看起来应该可以工作。通过使用
Integer.compareTo()
而不是自己在整数上实现行为,可以使它变得更简单,但这并不妨碍它的正确性。你能不能给我们一些代码,至少让我们看看
IndexEntry
类是什么样子的?我还对泛型的使用感到好奇(尽管它可能与您的实际问题无关)。我建议您在调试器中运行代码(或使用大量println语句),使用一个小的输入来重现问题。一个猜测:在您的示例输出中,您是否准确地打印出locationName?您正在比较的位置是否可能是文件路径(包括目录),其比较方式是否与文件名不同?为了避免进一步的胡乱猜测,您能否再显示一点
IndexEntry
的代码?更多信息:T可以是文件或字符串,但在本例中,它始终是字符串。嘿,自从你们中的一些人问起,刚刚添加了IndexEntry类。我仍在分析您的响应。找到了答案,但无法正常发布:我不知道为什么,但出于某种原因:this.firstOccurrence.equals(other.getFirstOccurrence())不等同于:this.firstOccurrence==other.getFirstOccurrence()更改该行修复了compareTo方法。我误诊了这个问题,因为每个条目实际上都在进行比较。对不起,误传了,谢谢大家的帮助!啊,那是因为它是一个
整数
,而不是
整数
=
通过标识而不是值来比较对象,类型为
Integer
的两个变量可以引用具有相同值但不同的对象。尽量避免对数字使用
整数
;各种奇怪的事情都可能发生。
    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);
        }
    }