要排序使用

要排序使用

问题描述:

所以目前我有两个班,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

变化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

非常感谢你的帮助,最后它似乎在工作! –