2016-12-16 21 views
1

我的練習說我應該用幾種方法實現一個叫做歌曲的類。 (見下文) 然後我應該具有給定的比較代碼的方法:如何在compareTo()中做更多的比較?

鬆1 < song2當且僅當

  • song1.singer < song2.singer
  • song1.singer = song2.singer∧ song1.title < song2.title
  • song1.singer = song2.singer∧song1.title = song2.title∧song1.year> song2.year

鬆1 = song2當且僅當

  • song1.singer = song2.singer∧song1.title = song2.title∧song1.year = song2.year

鬆1> song2其他

我執行第一次比較,它的工作原理,但我不知道如何寫下其他人。你有什麼提示嗎? 我只允許使用Comparable,而不是Comparator!

import java.util.ArrayList; 

import java.util.Collections; 

import java.util.List; 


public class Songs implements Comparable<Songs>{ 

private String singer; 
private String title; 
private Integer year; 


Songs(String singer, String title, int year){ 

     this.singer = singer; 
     this.title = title; 
     this.year = year; 

    } 
public String getSinger(){ 

     return this.singer; 
    } 
public String getTitle(){ 

     return this.title; 
    } 
public int getYear(){ 

     return this.year; 
    } 

public String getCompleteName(){ 

     return this.singer+"\t"+this.title.toString()+" - "+this.year.toString(); 
    } 





public int compareTo(Songs o) { 

     if (o.getSinger() == this.getSinger()) { 
       return 0; 
      } 
     if (this.getSinger()==null) { 
       return 1; 
      } 
     if (o.getSinger() == null) { 
       return -1; 
      } 
     return this.getSinger().compareTo(o.getSinger()); 




} 



    public static void main(String[] args) { 


     List<Songs> list = new ArrayList<Songs>(); 

     list.add(new Songs ("Birdman","Breathe", 1994)); 
     list.add(new Songs ("Lgoony","Nebel", 2012)); 
     list.add(new Songs ("Recondite","Cleric",2015)); 
     list.add(new Songs ("Alpha", "Beta", 1023)); 
     list.add(new Songs ("Cleric", "zoom", 1999)); 
     list.add(new Songs ("Cleric", "boom", 1999)); 

     Collections.sort(list); 

     for (Songs x : list) { 
       System.out.println(x.getCompleteName()); 
     } 
} 




} 
+0

您已經標記了你的問題都'comparator'和'comparable',和你「歌曲」班正在實施「可比」。你是否需要使用其中一種,或者你可以選擇哪一種更方便? –

+0

我只是添加這個有更多的標籤,我只允許使用可比較的 – Sascha

+0

啊,我知道如何用比較器,但我不知道如何用Comparable做到這一點,那我的問題 – Sascha

回答

1

您可以通過此實現自己的目標:

@Override 
public int compareTo(Songs o) { 

    int compare; 
    if ((compare = this.getSinger().compareTo(o.getSinger())) != 0) { 
     return compare; 
    } else if ((compare = this.getTitle().compareTo(o.getTitle())) != 0) { 
     return compare; 
    } 
    return this.getYear() - o.getYear(); 
} 
+0

不錯!謝謝你 !! – Sascha

+2

如果你願意,最後一半可以像get return() - o.getYear();一樣完成。 –

+0

@ Ole V.V.答案更新;) – Maraboc

1

我會做這種方式

@Override 
public int compareTo(Songs song) { 
    int val=0 ; 
    if(!singer.equals(song.getSinger())){ 
    return singer.compareTo(song.getSinger()); 
    } 
    else if (!title.equals(song.getTitle())){ 
     return title.compareTo(song.getTitle());} 
     else {return -1*song.getYear().compareTo(year);} 

    } 
+0

不錯!謝謝你 !! – Sascha

+0

如果'getYear()'返回了一個類似的對象,這將是一個不錯的解決方案。它返回一個原始的'int',所以'song.getYear()。compareTo()'不會被編譯。 –