![](/img/trans.png)
[英]Is it possible to implement reverseOrder() method using Comparator<T>?
[英]Java Comparator using .reverseOrder() but with an inner class
我正在創建一個簡單的程序來了解Java Comparator類。 我已經按順序對一個Arraylist
了排序,但現在我想按降序對列表進行排序,但是我在調用.reverseOrder()
方法時遇到問題,因為我使用了一個實現Comparator<Song>
的內部類(歌曲是一首歌)容納吸氣劑和制定者方法的類)。
這是我的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);
}
}
任何人都可以幫我弄清楚我將在SongSort
類中調用reverseOrder()
方法,因為它不會編譯?
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());
實現逆序比較器的一種方法是實現反轉比較器結果的Compartor-Delegate(通過改變順序)。
public class ReverseOrder<T> implements Comparator<T> {
private Comparator<T> delegate;
public ReverseOrder(Comparator<T> delegate){
this.delegate = delegate;
}
public int compare(T a, T b) {
//reverse order of a and b!!!
return this.delegate.compare(b,a);
}
}
所以你唯一需要做的就是使用這個委托。 例如:
Comparator myComparator = new myComparator();
List list = ...;
List reverse = new ArrayList(list);
//acceding
Collections.sort(list, myComparator);
//descending
Collections.sort(list, new ReverseOrder(myComparator));
讓我們舉一個簡單的例子,我們有一個Person有兩個字段名稱age的類,我們想根據它們的年齡對現有的一組人進行排序,所以讓我們假設我們有一個帶有構造函數的Person,並將這些人添加到列表中然后排序他們沒有方法的集合類:
Person bachiri = new Person (17,"bachiri");
Person taoufiq = new Person (14,"Taoufiq");
Person abderrahman = new Person (15,"abderrahman");
List<Person> persons = new ArrayList<>();
而這就是Agecomparable的阻礙:
class AgeComparator implements Comparator<Person>{
@Override
public int compare(Person person1, Person person2) {
return Integer.compare(person1.getAge(),person2.getAge());
}
}
訣竅是使用-1復用return方法,以便最終結果反轉:class AgeComparator實現Comparator {
@Override
public int compare(Person person1, Person person2) {
return -1 * Integer.compare(person1.getAge(),person2.getAge());
}
}
所以現在我們可以得到相反的結果:
Collection.sort (Persons, new AgeComparator());
如果需要使用反轉當前順序的比較器,只需在compare
方法中返回負值 。
public class ComparatorInverse implements Comparator<Object> {
@Override
public int compare(Object lhs, Object rhs) {
return -1;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.