【问题标题】:Method to Compare variable in JavaJava中比较变量的方法
【发布时间】:2016-01-21 04:31:04
【问题描述】:

编写一个代码,它在超类中有一个名为 compareTo() 的方法,并且必须在测试器类中实现。

我的问题是我无法让 compareTo() 方法在 Animal 类中工作。非常感谢任何帮助!

到目前为止的代码:

import java.util.Comparator;

abstract class Animal implements Comparable<Animal> {

    private String firstName;
    private String lastName;
    private int size;

    // Default Constructor
    public Animal(String firstName, String lastName, int size){
        super();
        firstName = "";
        lastName = "";
        size = 0;
    }

    // Setters and Getters
    public void setFirstName(String firstName){
        firstName = firstName;
    }
    public String getFirstName(){
        return firstName;
    }

    public void setLastName(String lastName){
        lastName = lastName;
    }
    public String getLastName(){
        return lastName;
    }

    public void setSize(int size){
        size = size;
    }
    public int getSize(){
        return size;
    }

    // CompareTo method
    public int compareTo(Animal compareAnimal) {

        String compareFirstName = ((Animal) compareAnimal).getFirstName();
        return firstName;

    }


    // Abstract method to be implemented in subclasses
    abstract String sound();

    // To be overriden in subclasses 
    @Override
    public String toString(){
        return getFirstName() + getLastName() + getSize() + " says " + sound();
    }
}

public class Dog extends Animal {

    // Calls the constructor in the superlcass
    public Dog(String firstName, String lastName, int size){
        super(firstName, lastName, size);
    }

    // Implements the abstract methods in Animal class
    public String sound(){
        return "woof";
    }

}

public class Cat extends Animal {

    // Calls the constructor in the superlcass
    public Cat(String firstName, String lastName, int size){
        super(firstName, lastName, size);
    }

    // Implements the abstract methods in Animal class
    public String sound(){
        return "meow";
    }
}

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.LinkedList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

public class Tester {

    public static void main(String[] args) {

        Dog dog1 = new Dog();
        Cat cat1 = new Cat();

        dog1.setFirstName("Patch");
        dog1.setLastName("Cabbage");
        dog1.setSize(5);
        System.out.println(dog1.toString());
        System.out.println();

        cat1.setFirstName("Felix");
        cat1.setLastName("Longbottom");
        cat1.setSize(3);
        System.out.println(cat1.toString());
        System.out.println();

        // Create new ArrayList
        LinkedList<Animal> animalList = new LinkedList<>();

        // Add animals to the animalList
        animalList.add(dog1);
        animalList.add(cat1);

        // Sort by first name
        List <String> firstName = new LinkedList<String>( );
        try{
            File file = new File("Animals.txt");
            BufferedReader reader = new BufferedReader(new FileReader(file));
            String line = null;
            while ((line = reader.readLine()) != null){
                firstName.add(line);
            }
        } catch(Exception e){
            e.printStackTrace();
        }

        Iterator<String> itr = firstName.iterator( );
        while ( itr.hasNext( ) ) {
            String person = itr.next( );
            System.out.println(person);
        }
        Collections.sort(firstName);

        class InnerClass implements Comparator {
            // body
        }
    }
}

【问题讨论】:

  • 您预计会发生什么,正在发生什么?你试过什么?
  • 我想使用 compareTo 方法在测试器类中按 firstName 进行排序,但我目前正在尝试的方法不允许发生这种结果。 @史蒂夫克兰顿
  • @SteveClanton 在 Animal 类中,我想使用 compareTo 方法比较 firstName,然后在测试器中使用 Collections.sort() 按 firstName 对列表进行排序,然后覆盖 compareTo 方法进行排序其他变量。
  • 查看您的compareTo 方法...您在比较什么?提示:您想在方法中将compareAnimalthis 进行比较。您不想返回名字。您需要将compareAnimal 的名字与this 的名字进行比较。当您将这两个字符串相互比较时,您希望返回比较的结果。
  • @SteveClanton 是这样的吗?: public int compareTo(Animal compareAnimal) { int result = this.firstName.compareTo( compareAnimal ); System.out.println(结果); }

标签: java list variables methods compare


【解决方案1】:

您的 compareTo 方法没有意义:

 // CompareTo method
public int compareTo(Animal compareAnimal) {
    String compareFirstName = ((Animal) compareAnimal).getFirstName();
    return firstName;
}   

首先,这甚至不会编译,因为您正在为一个应该返回一个 int 的方法返回一个 String。您应该将compareFirstNamefirstName 进行比较并返回一些内容。

提示 - 字符串库有一些非常相似的东西来比较 2 个字符串并返回一个 Int。

【讨论】:

  • 当我将 public int compareTo 更改为 String 时,它仍然不起作用
  • 它不起作用,因为您正在实现Comparable 接口,这需要您为compareTo 方法返回一个int。
  • 将 int 更改为 String 不是正确的做法。你需要在 compareAnimal 和this 之间做一些比较,并相应地返回整数。
【解决方案2】:

此代码不应编译。您的方法应返回 int,而不是 String

//no comparison happens...just trying to return first name
public int compareTo(Animal compareAnimal) {
    String compareFirstName = ((Animal) compareAnimal).getFirstName();
    return firstName; //firstName is not an int!!
}   

此外,您的 compareTo 方法中没有任何内容被“比较”。您需要比较传递给 somethingcompareAnimal,而那是 this。您需要从两个对象中获取名字并比较它们,而不是返回名字:

public int compareTo(Animal compareAnimal) {
    String otherName = compareAnimal.getFirstName();
    return firstName.compareTo(otherName);
}

另外,请注意我没有将compareAnimal 转换为Animal,因为那已经是参数的类型。如果我将它作为Object 传递(就像您实现equals 时的情况一样,我需要强制转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多