Java 某物';What’我的可比性的实现有什么问题吗

Java 某物';What’我的可比性的实现有什么问题吗,java,collections,iterable,Java,Collections,Iterable,所以我尝试使用树形图来创建一个数据集合,然后我想在使用我自己的比较器时得到一个排序列表 我的问题是Collections.sort抛出并出错,因为只能迭代java.lang.Iterable的数组或实例,但我的ExtsList是ArrayList类型,正如这里所示,它确实是Iterable List extsListed=newarraylist(exts.values()); for(FileInfo:Collections.sort(extsListed)){ System.out.prin

所以我尝试使用树形图来创建一个数据集合,然后我想在使用我自己的比较器时得到一个排序列表

我的问题是Collections.sort抛出并出错,因为
只能迭代java.lang.Iterable的数组或实例
,但我的ExtsList是ArrayList类型,正如这里所示,它确实是Iterable

List extsListed=newarraylist(exts.values());
for(FileInfo:Collections.sort(extsListed)){
System.out.println(info.key+“”+info.count+“”+info.size);
}
System.out.println(totalFound.toString()+“”+totalSize);
}
公共静态类FileInfo实现了可比较的{
字符串键;
整数计数;
长尺寸;
公共文件信息(字符串键、文件){
计数=1;
this.key=key;
this.size=file.length();
}
公共整数比较(文件信息其他){
如果(this.size>other.size)返回1;
else if(this.size==other.size){
如果(this.key.compareTo(other.key)>=1)返回1;
else if(this.key.equals(other.key))返回0;
否则返回-1;
}
否则返回-1;
}
}

集合。排序
返回
无效
。它不会为您返回已排序的集合。在调用
sort
之后,您可以简单地迭代集合本身:

Collections.sort(extsListed);
for (FileInfo info : extsListed) {
   ...
收藏是一种空虚。所以它不会返回值:

更改:

  List<FileInfo> extsListed = new ArrayList<FileInfo>(exts.values());

    for (FileInfo info : Collections.sort(extsListed)) {
        System.out.println(info.key + ' ' + info.count + ' ' + info.size);
    }
List extsListed=newarraylist(exts.values());
for(FileInfo:Collections.sort(extsListed)){
System.out.println(info.key+“”+info.count+“”+info.size);
}
致:

List extsListed=newarraylist(exts.values());
Collections.sort(extsListed);
对于(文件信息:extsListed){
System.out.println(info.key+“”+info.count+“”+info.size);
}

在Java 8中,您可以编写

public static class FileInfo implements Comparable<FileInfo>{
    String key;
    int count; // don't use a wrapper unless you want it to be null.
    long size;

    public FileInfo(String key, File file){
        count = 1;
        this.key = key;
        this.size = file.length();
    }

    public int compareTo(FileInfo other) {
        int cmp = Integer.compare(size, other.size);
        if (cmp == 0)
            cmp = key.compareTo(other.key);
        return cmp;
    }
}

另一种方法是根本不使用可比较的方法

public static class FileInfo implements Comparable<FileInfo>{
    final String key;
    final int count; // don't use a wrapper unless you want it to be null.
    final long size;

    public FileInfo(String key, File file){
        count = 1;
        this.key = key;
        this.size = file.length();
    }
    public String getKey() { return key; }
    public long getSize() { return size; }
    public String toString() { return key + ' ' + size + ' ' + count; }
}


exts.values().stream()
              .sort(comparing(FileInfo::getSize).andThen(FileInfo::getKey))
              .forEach(System.out::println);
公共静态类FileInfo实现可比较{
最后的字符串键;
final int count;//除非希望包装为null,否则不要使用包装。
最终长尺寸;
公共文件信息(字符串键、文件){
计数=1;
this.key=key;
this.size=file.length();
}
公共字符串getKey(){return key;}
public long getSize(){return size;}
公共字符串toString(){return key+''+size+''+count;}
}
exts.values().stream()
.sort(比较(FileInfo::getSize).然后(FileInfo::getKey))
.forEach(System.out::println);
一些可能有用的链接


  • 我喜欢这个。我一直在问为什么没有这样的东西+50@DominikDitoIvosevic顺便说一句,如果您没有使用Java8,也许您应该这样做。Java 7将于4月下线。我用Java编写了大约15个小时的代码,所以它不像“不使用java8”那样多,更多的是“不使用任何Java”:D你能给我一些谷歌搜索词吗?我应该用它们来查找更多关于Java的功能用法sort@DominikDitoIvosevic我添加了一些关于主题的链接。如果你想知道更多的话,你可以从中找到一些术语。@DominikDitoIvosevic对我来说是Java的15年;)@DominikDitoIvosevic你可以调试并找出原因。
    public static class FileInfo implements Comparable<FileInfo>{
        String key;
        int count; // don't use a wrapper unless you want it to be null.
        long size;
    
        public FileInfo(String key, File file){
            count = 1;
            this.key = key;
            this.size = file.length();
        }
    
        public int compareTo(FileInfo other) {
            int cmp = Integer.compare(size, other.size);
            if (cmp == 0)
                cmp = key.compareTo(other.key);
            return cmp;
        }
    }
    
    extsListed.sort();
    
    public static class FileInfo implements Comparable<FileInfo>{
        final String key;
        final int count; // don't use a wrapper unless you want it to be null.
        final long size;
    
        public FileInfo(String key, File file){
            count = 1;
            this.key = key;
            this.size = file.length();
        }
        public String getKey() { return key; }
        public long getSize() { return size; }
        public String toString() { return key + ' ' + size + ' ' + count; }
    }
    
    
    exts.values().stream()
                  .sort(comparing(FileInfo::getSize).andThen(FileInfo::getKey))
                  .forEach(System.out::println);