java - CompareTo() 在两个不同的类中,其中一个不可访问

标签 java sorting comparable

我有两个不同的类,它们有两种不同的 compareTo() 方法。当我对列表进行排序时,我希望它首先按年龄排序。但如果是两个 Fysiker 进行排序,并且他们的年龄相同,我希望它按“年份”排序,即他们开始学习的年份。

当我运行主类时,我将 80 个 Fysiker 放入列表中,对它们进行排序,然后打印它们。他们都按年龄排序,但不按年份排序(如果他们的年龄相同)。

Edit1(为什么它不重复): 我无法使用 abstract 来解决这个问题(他们在这个问题的重复标记版本中做到了),是因为我需要能够实例化一个 Human > 通过编写 Human humantest = new Human()

主类:

public class Main {
public static void main(String[] args) {

    ArrayList<Human> randomFysiker = new ArrayList<Human>();
    for (int j=0;j<80;j++) {

        Fysiker f = new Fysiker();
        randomFysiker.add(f);
}       
    Collections.sort(randomFysiker);

    System.out.println(randomFysiker);
}


}

人类类别:

import java.util.Arrays;
import java.util.List;
import java.util.Random;

public class Human implements Comparable<Human> {

int age;
String name;
List<String> people = Arrays.asList("A","B","C","D","E","F","G","H","I","J","K","L","M","N","P");
Random randomGenerator = new Random();

public Human(int myAge, String myName) {
    name = myName;
    age = myAge;
}

public Human() {
    this.age = randomAge();
    this.name = randomName();
        }

public int compareTo(Human o) {
    return this.age - o.age;
}

private int randomAge() {
    return randomGenerator.nextInt(100);
}

protected String randomName() {
    return people.get(randomGenerator.nextInt(people.size()));
}

public int getAge() {
    return this.age;
}

public String getName() {
    return name;
}

public String toString() {
    return "\nName: " + name + "\nAge: " + age + " yrs old\n";
}
}

Fysiker 级:

public class Fysiker extends Human {

private int year;

public Fysiker(int myAgeF, String myNameF, int myYearF) {
    this.name = myNameF;
    this.age = myAgeF;
    this.year = myYearF;
}

public Fysiker() {
    this.name = randomName();
    this.age = randomAge();
    this.year = randomYear();
}

public int compareTo(Fysiker o) {
    if (this.age - o.age != 0) {
        return super.compareTo(o);
    }
    else {
        return this.year - o.year;
    }
}

private int randomAge() {
    return 15 + randomGenerator.nextInt(86);
}

private int randomYear() {
    int yearfifteen = 2015 - age + 15;
    if (yearfifteen >= 1932 && 2015 >= yearfifteen){
        return randomGenerator.nextInt(age-14) + yearfifteen; //(max-min)=(yearfifteen+age-15+1)-(yearfifteen+1)
    }
    else {
        return 1932 + randomGenerator.nextInt(84);
    }
}

public int getYear(){
    return year;
}

public String toString() {
    return super.toString() + "Started Physics: " + String.format("F%02d", this.year%100) + "\n";
}
}

最佳答案

Fysiker类的compareTo()方法更改为:

public int compareTo(Human o) {
    if (this.age - o.age != 0) {
        return super.compareTo(o);
    }
    else {
        return this.year - ((Fysiker)o).year;
    }
}

因此这将覆盖父类(super class)方法,从而调用子类(即 Fysiker)的方法。

关于java - CompareTo() 在两个不同的类中,其中一个不可访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47232990/

相关文章:

java - Comparable 不排序对象

java - 客户端套接字读取 "freezes"

java - LibGDX 2D ||在屏幕外对象上调用draw()是否效率低下或者它们会被自动剔除?

javascript - 数组排序日期未按预期工作

python - python中按行对数组进行排序

java - 什么是 "natural ordering"?

java - 当我在循环中创建线程时,它是真正的多线程吗

java - 它是一个正确的 JSON 文件吗?

列表上的 Python sort() 方法与内置 sorted() 函数

java - 接口(interface)实现可比吗?