我正在创建一个简单的程序来了解Java
Comparator类。我已经按顺序进行Arraylist
了排序,但是现在我想按降序对列表进行排序,但是.reverseOrder()
由于使用了实现的内部类Comparator<Song>
(歌曲是容纳getter和setter方法的歌曲类),在调用该方法时遇到了问题。
这是我的SongSort
课程,里面包含分类过程等。
import java.util.*;
import java.io.*;
public class SongSort
{
ArrayList<Song> songList = new ArrayList<Song>();
public void main(String[] args)
{
new SongSort().go();
}
class ArtistCompare implements Comparator<Song>
{
public int compare(Song one, Song two)
{
return one.getRating().compareTo(two.getRating());
}
}
public void go()
{
getSongs();
System.out.println(songList);
//Collections.sort(songList);
System.out.println(songList);
ArtistCompare artistCompare = new ArtistCompare();
Collections.sort(songList, artistCompare);
System.out.println(songList);
}
public void getSongs()
{
try{
File file = new File("SongListMore.txt");
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = null;
while((line = reader.readLine()) != null)
{
addSong(line);
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
public void addSong(String lineToParse)
{
String [] tokens = lineToParse.split("/");
Song nextSong = new Song(tokens[0], tokens[1], tokens[2], tokens[3]);
songList.add(nextSong);
}
}
这是我的简单Song
课程;
public class Song //implements Comparable<Song>
{
private String title;
private String artist;
private String rating;
private String bpm;
public Song(String t, String a, String r, String b)
{
title = t;
artist = a;
rating = r;
bpm = b;
}
public String getTitle()
{
return title;
}
public String getArtist()
{
return artist;
}
public String getRating()
{
return rating;
}
public String getBpm()
{
return bpm;
}
public String toString()
{
return ("Title : " + title + "," + " Artist : " + artist + " Rating : " + rating);
}
}
有人可以帮我弄清楚我将reverseOrder()
在SongSort
类中调用该方法的地方,因为它无法编译?
ArtistCompare artistCompare = new ArtistCompare();
Collections.sort(songList, Collections.reverseOrder(artistCompare));
编辑2015年7月
由于此答案仍然受到关注,因此这里进行了一个小更新:
使用Java SE 8,创建反向比较器变得更加容易:
Comparator<Song> songRatingComparator = Comparator.comparing(Song::getRating);
Collections.sort(songList, songRatingComparator.reversed());
当然,您还可以使用Streams框架:
List<Song> sortedSongList = songList.stream()
.sorted(Comparator.comparing(Song::getRating).reversed())
.collect(Collectors.toList());
对于某个项目,我必须按地区和名称订购一些数字。首先,它们按面积从大到小排序,如果它们一致,则按字母顺序排序。在一个名为的类中,我有一个类型如下的内部类: 如果我想从另一个类对一组进行排序,我该如何做?我认为最好的方法是下面的,但失败了(
我想知道是否可以制作实现比较器接口的非静态内部类。 例如:。 我想使用比较器类非静态,因为我想使用非静态字段“num”并想修改它的值。有非静态比较器内部类可以吗? 附加信息 对于每个对象,我都在计算内部的分数,并进行相应的比较和排序。我需要将这些分数保存在我在comparator内计算的地图中,并希望在外部类中使用该地图进行进一步计算。
我正在我的类Employee中实现Comparator和Comparable来排序ArrayList。我在2个参数名称和ID排序。当使用collections.sort(Employee ob1,Employee ob2)进行ID排序时,它不起作用。我得到一个编译错误,即类没有声明为弃权,也没有重写compare(),尽管我是这样做的: 如果我使用 我的疑问是,既然员工也是一个对象,为什么早先的不
问题内容: 我们有一些代码根据其坐标之间的距离对地址列表进行排序。这是通过使用自定义比较器的collections.sort完成的。 但是,列表中有时不包含地址,这会导致NullPointerException。解决这个问题的最初想法是让比较器返回至少0个坐标为零的地址的距离。我担心这可能导致列表中“有效”元素的顺序损坏。 因此是否可以在比较器中为空数据返回“ 0”值,还是有一种更干净的方法来解决
我尝试用降序的内部比较器类实现优先级队列,但是当我打印优先级队列时,我没有得到正确的结果。当我尝试收集相同的比较器代码时。排序以实现列表的排序(使用相同的值)。我得到了正确的结果。你能解释一下吗? 上述代码的答案是pq值为[50,40,20,10,30] 以上代码的答案是数组值为:[50,40,30,20,10]
当我使用比较器运行“上限”时,它会给我以下错误:错误:引用类型“const std::vector” 在prog_joined中包含的文件中。cpp:1:包含在中的文件中/预编译/标题。h:13:在/usr/bin/中包含的文件中/lib/gcc/x86_64-linux-gnu/9/../../../../..//include/c/9/cmath:1927:在/usr/bin/中包含的文件中/