2017-11-11 1 views
-3

derzeit zwei Klassen Ich habe, Human und Fysiker, Human nimmt zwei Argumente, eine age und name, während Fysiker drei Argumente nimmt, age, name und startyear.Möchten Sie eine Liste mit zwei Klassen sortieren Also mit

Bemerkenswert ist, dass ich Fysiker mit Human verlängert habe, mein Problem ist, dass ich die zwei von ihnen nach Alter sortiert werden sollen, die perfekt funktioniert, aber wenn zwei Fysiker das gleiche Alter bekam, ich möchte, dass sie sortieren nach startyear. Derzeit habe ich Collections.sort dafür verwendet, und es funktioniert in gewissem Umfang. Das Problem ist, dass manchmal, sagen wir, ich 100 Objekte erstellt haben, 50 Human und 50 Fysiker ich einen Ausdruck wie folgt zu erreichen:

Saga, 30 Jahre 1972 (Fysiker) Tomas, 30 Jahre, 1974 (Fysiker) Nils, 30 Jahre (Human) Frida, 30 Jahre, 1969 (Fysiker, sortiert falsch, das sollte man zuerst sein)

Beachten Sie, dass dies mein Ausdruck war Collections.sort verwendet wird, ist es eine Möglichkeit für ich, um den Ausdruck zu bekommen, wie es sein sollte, ich habe nichts dagegen, ein Mensch zwischendurch, aber ich möchte alle Fysiker in der Ri sortiert werden Es scheint fast so, als ob Collections.sort einfach zwei von ihnen betrachtet und diese sortiert und weitergeht. Meine zwei Klassen sucht derzeit wie folgt aus:

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; 
    } 

} 

Und:

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

Bitte lesen Sie [mcve] und erweitern Sie Ihre Frage entsprechend. – GhostCat

+0

Ich war wie "Jon Skeet?" – mattias

+0

Und nur für den Fall, dass Sie Ihren Spitznamen zu Ehren des großen Jon Skeet gewählt haben. News für Sie: Ihre Eingabe ist es nicht wert, diesen Namen zu verwenden. MEINER BESCHEIDENEN MEINUNG NACH. – GhostCat

Antwort

0

Änderung der if Zustand aus:

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

zu

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

warum ist diese Änderung Nece ssary?

wird angenommen, dass zwei Objekte das gleiche Alter haben und dann wollen Sie überprüfen, ob o vom Typ Fysiker, die derzeit als Ihr Code geschrieben wird, wird es immer bewerten zu wahr unabhängig davon, ob o vom Typ Fysiker oder nicht und verhindert daher die Auswertung von o instanceof Fysiker.

der Code innerhalb des if Block sollte nur ausführen, wenn zwei Objekte im gleichen Alter und o haben, ist vom Typ Fysiker aber das ist nicht das, was der Code aufgrund der && this instanceof Fysiker tut.

+1

Vielen Dank für diese Hilfe, endlich scheint es zu funktionieren! –

Verwandte Themen