2017-11-11 98 views
-3

所以目前我有兩個班,HumanFysikerHuman取兩個參數,一個agename兩個類的列表,而Fysiker正在採取三個參數,agenamestartyear要排序使用

值得注意的是,我已經擴展FysikerHuman,我的問題是,我想年齡後他們兩個,這是可以正常使用排序,但如果兩個Fysiker得到了相同的年齡,我要對它們進行排序之後startyear。目前我已經使用了Collections.sort,並且它在某種程度上起作用。問題是,有時,讓我們說我創建100個對象,50 Human和50 Fysiker,我能得到這樣的打印輸出:

傳奇,30年來,1972年(Fysiker)托馬斯,30年來,1974年(Fysiker)尼爾斯, 30年(人)弗裏達30年代,1969年(Fysiker,整理錯了,這 一個應該是第一個)

請注意,這是使用Collections.sort我的打印輸出,是有辦法我得到打印輸出,因爲它應該是,我不介意一個人之間,但我希望所有的Fysiker排序在裏ght的方式,它幾乎看起來像Collections.sort只是看着他們中的兩個,並排序這些並繼續前進。我的兩個班目前正在尋找這樣的:

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 
import java.util.Random; 
import java.util.Collections; 
public class Human implements Comparable<Human>{ 
    static Random rand=new Random(); 
    public int age; 
    public String name; 
    public static List<String> names=Arrays.asList("hugo","tor","tomas"); 

    public Human(int age, String name) { 
     this.age=age; 
     this.name=name; 
    } 
    public Human() { 
     this.age=rand.nextInt(101); 
     this.name=names.get(rand.nextInt(3)); 
    } 
    public String getName() { 
     return this.name; 
    } 
    public int getAge() { 
     return this.age; 
    } 
    public String toString() { 
     return "\n namnet är:"+" "+this.name+" "+"åldern är:"+" "+this.age; 
    } 
    public int compareTo(Human o) { 
     return this.age - o.age; 
    } 

} 

和:

import java.util.concurrent.ThreadLocalRandom; 

public class Fysiker extends Human { 
    int startyear; 

    public Fysiker(int age,String name,int startyear) { 
     if (startyear>=1932 && startyear<=2015){ 
      this.startyear=startyear; 
      this.age=age; 
      this.name=name;} 
     else{ 
      System.out.println("nej"); 
     } 
     if (age>=15 && age<=100){ 
      this.age=age; 
      this.name=name; 
      this.startyear=startyear;} 
     else{ 
      System.out.println("nej");} 

     } 


    public Fysiker() { 
     this.startyear = 1932 + rand.nextInt(84); 
     this.age = ThreadLocalRandom.current().nextInt(2015-this.startyear+15, 101); 
     this.name = names.get(rand.nextInt(3)); 
    } 

    public String getYear() { 
     return String.format("F %02d", this.startyear % 100); 
    } 

    public String toString() { 
     return super.toString() + " " + "startåret är:" + " " + String.format("F %02d", this.startyear % 100); 
    } 

    public int compareTo(Human o) { 
     if(this.age==o.age && this instanceof Fysiker && o instanceof Fysiker) { 
      return this.startyear-((Fysiker)o).startyear;} 

     return super.compareTo(o);} 

} 
+0

請閱讀[mcve]並相應地提高您的問題。 – GhostCat

+0

我喜歡「Jon Skeet?」 – mattias

+0

而且萬一你選擇了你的暱稱來紀念偉大的Jon Skeet。新聞給你:你的意見不值得使用這個名字。恕我直言。 – GhostCat

回答

0

變化if條件從:

if(this.age == o.age && this instanceof Fysiker && o instanceof Fysiker) 

if(this.age == o.age && o instanceof Fysiker) 

這是爲什麼變化nece ssary?

假設兩個對象具有相同的年齡,然後要檢查是否oFysiker類型,目前作爲你編寫代碼將總是評估爲真正無論oFysiker類型或不是,因此阻止了o instanceof Fysiker的評估。

if塊中的代碼應該如果兩個對象具有相同的年齡執行和oFysiker型的,但是這不是你的代碼是由於&& this instanceof Fysiker做。

+1

非常感謝你的幫助,最後它似乎在工作! –