2015-10-22 4 views
-1

Написание кода, который в суперклассе имеет метод compareTo() и должен быть реализован в классе тестера.Метод сравнения переменной в Java

Моя проблема заключается в том, что я не могу заставить метод 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 
     } 
    } 
} 
+0

Что вы ожидаете от случившегося и что происходит? Что вы пробовали? –

+0

Я хочу использовать compareTo для сортировки firstName в классе тестера, но то, что я пытаюсь в настоящее время, не позволит этому результату. @SteveClanton –

+0

@SteveClanton в классе Animal, я хочу использовать метод compareTo для сравнения firstName, а затем в использовании тестера Collections.sort(), чтобы отсортировать список по первому имени и затем переопределить метод compareTo для сортировки по другим переменным. –

ответ

0

Ваш метод CompareTo не имеет смысла:

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

Прежде всего, это не собирается даже компилироваться, потому что вы возвращаете String для метода, который должен возвращать int. Вы должны сравнить compareFirstName с firstName и вернуть что-нибудь.

Подсказка. В библиотеке String есть что-то очень похожее на сравнение 2 строк и возвращение Int.

+0

Когда я меняю общедоступный int compareTo на String, он все равно не будет работать –

+1

Это не сработает, потому что вы реализуете интерфейс [Comparable] (http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html), в котором вам нужно вернуть int для метода '' 'compareTo''' , – Siddhartha

+0

Изменение int на String - неправильная вещь. Вам нужно провести сравнение между compareAnimal и '' 'this''' и вернуть целое число соответственно. – Siddhartha

0

Этот код не следует компилировать. Ваш метод должен вернуть 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. Вам необходимо сравнить compareAnimal, который передается в что-то, и что-то есть this. Вместо возвращения имя, вам нужно, чтобы получить первое имя из обоих объектов и их сравнения:

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

Также, обратите внимание, что я не подавал compareAnimal к Animal, потому что это уже тип параметра. Если я передал его как Object (как в случае, когда вы реализуете equals, мне нужно было бы отличить.

Смежные вопросы