Настройка метода compareTo() в Java

Обратите внимание: ранее я создал сообщение, в котором был этот вопрос и несколько других, но мне сказали, что, поскольку я задаю так много вопросов в одном и том же сообщении, было бы лучше разбить его на индивидуальные вопросы. Поэтому, пожалуйста, не отмечайте это как дубликат, да, инструкции те же и да, используется тот же код, но сам вопрос другой. Спасибо.

Я работаю над программой со следующими инструкциями:

Напишите класс Octagon, который расширяет GeometricObject и реализует интерфейсы Comparable и Cloneable. Предположим, что все 8 сторон восьмиугольника имеют одинаковый размер. Площадь можно вычислить по следующей формуле

area = (2 + 4/square root of 2) * side * side 

Напишите программу (драйвер) для считывания ряда значений из файла, отображения площади и периметра, создания клона и сравнения объекта и его клона (на основе площади). Кроме того, ваша программа должна сравнивать текущий объект (только что считанный) с первым считанным объектом. Программа завершается, когда из файла считывается отрицательное число.

Вот код, который у меня есть до сих пор, это мой класс GeometricObject:

public abstract class GeometricObject {
    
    public abstract double getArea();
    public abstract double getPerimeter(); 
}

Мой Octagon класс:

public class Octagon extends GeometricObject implements Comparable<Octagon> {
    private double side = 1.0;
    protected native Object clone() throws CloneNotSupportedException;
    private static int numberOfObjects = 0; 
    
    public Octagon() {
    }
    
    public Octagon(double side) {
        this.side = side;
        numberOfObjects++;
    }

    public double getSide() {
        return side;
    }

    public void setSide(double side) {
        this.side = side;
    }
    
    public double getArea() {
        return (2 + (4 / (Math.sqrt(2))) * side * side); 
    }
    
    public double getPerimeter() {
        return side * 8;
    }
    
    public String toString() {
        return "Octagon " + numCreated + ": Area: " + getArea() + "\nPerimeter: " 
            + getPerimeter() + "\nClone Compare: " + Cloneable + "\nFirst Compare: "
            + comparisson;
    }
    
    public int compareTo(Octagon octagon) {
        if(getArea() > octagon.getArea()) 
            return 1;
        else if(getArea() < octagon.getArea()) 
                return -1;
        else
            return 0;
    }

    public interface Cloneable {
    } 
}

И мой класс Driver или тестер: (здесь мне больше всего нужна помощь)

import java.util.*;
import java.io.*; 

public class Driver {
    public static void main(String[] args) {
        int comparisson = compareTo(octagon);
        java.io.File file = new java.io.File("prog7.dat");
        Scanner fin = new Scanner(file);
        
        while(fin.hasNext()) {
            double side = fin.nextDouble();
                if(side < 0.0) break;
            Octagon first = new Octagon(side);
            System.out.println("Octagon 1: " + first);
        
        }
        
    }
}

И вот файл, используемый для ввода. Каждая строка представляет собой один восьмиугольник:

5.0
7.5
3.26
0.0
-1.0

У меня возникли проблемы с настройкой метода compareTo(). Я никогда не использовал это раньше, и хотя я прочитал документацию и имею общее представление о том, как это работает, у меня возникли проблемы с пониманием того, как реализовать это в моей конкретной программе.

В том же духе я знаю, что метод compareTo() возвращает целочисленное значение -1, 0 или 1 в зависимости от того, меньше, больше или равен текущий объект объекту, с которым он сравнивается. Однако, как вы можете видеть из выходных данных примера, вместо отображения этого целочисленного значения я должен отобразить что-то вроде первого меньше. Я почти уверен, что для этого мне нужно будет присвоить возвращаемое значение переменной, а затем использовать операторы if, чтобы определить, что должно быть напечатано, но мне трудно понять, как и в какой момент в моем коде это должно быть сделано?


person Community    schedule 04.08.2014    source источник
comment
compareTo() не должен возвращать только -1, 0 или 1. Он просто должен вернуть отрицательное значение int, 0 или положительное значение int.   -  person Jashaszun    schedule 05.08.2014
comment
Правильно, я в основном имею в виду, что он должен возвращать целое число, которое не является выводом, который мне нужно отображать.   -  person    schedule 05.08.2014
comment
Ваша функция compareTo может быть записана короче: return Double.compare(getArea(), octagon.getArea());   -  person fabian    schedule 05.08.2014


Ответы (2)


Основываясь на этой строке вашего требования: In addition, your program should compare the current object (just read in) with the first object read in. Вот некоторый код для этого. В основном это считывает Octagons до тех пор, пока не будет прочитано отрицательное число, и сравнивает каждое из них с первым прочитанным Octagon.

Octagon first = null;
int i = 0;
while(fin.hasNext())
{
    double side = fin.nextDouble();
    if(side < 0.0)
        break;
    Octagon oct = new Octagon(side);
    System.out.print("Octagon " + i + ": \"" + oct.toString() + "\"");
    if (first == null)
        first = oct;
    else
    {
        // Here is where we compare the current Octagon to the first one
        int comparison = oct.compareTo(first);
        if (comparison < 0)
            System.out.print(", less than first");
        else if (comparison > 0)
            System.out.print(", greater than first");
        else System.out.print(", equal to first");
    }
    Octagon first = new Octagon(side);
    System.out.println();
}
person Jashaszun    schedule 04.08.2014
comment
Спасибо! Единственная проблема, с которой я столкнулся сейчас, это то, что он не печатает площадь или периметр. Результат выглядит следующим образом: Октагон 1: Octagon@134bed0 Octagon 2: Octagon@1db4f6f, больше первого Octagon 3: Octagon@13c1b02, меньше первого Octagon 4: Octagon@11121f6, меньше первого - person ; 05.08.2014
comment
Проверьте мое редактирование. (Я изменил первый System.out.print на oct.toString() вместо oct.) Однако я не уверен, почему у вас возникла эта проблема, поскольку вы перегрузили Object.toString(). - person Jashaszun; 05.08.2014
comment
Похоже, что toString() правильно переопределен, но если вы добавите к нему аннотацию @Override, компилятор сообщит вам, если вы допустили какую-то ошибку и неправильно переопределили метод суперкласса. - person David Conrad; 05.08.2014
comment
Добавление oct.toString() устранило проблему. Благодарю вас! - person ; 05.08.2014

int compareTo(Объект о)

or

int compareTo (строка другая строка)

public class Test {

   public static void main(String args[]) {
      String str1 = "Strings are immutable";
      String str2 = "Strings are immutable";
      String str3 = "Integers are not immutable";

  int result = str1.compareTo( str2 );
  System.out.println(result);

  result = str2.compareTo( str3 );
  System.out.println(result);

  result = str3.compareTo( str1 );
  System.out.println(result);
   }
}

Это дает следующий результат:

0
10
-10

Также вы можете проверить -> http://www.javapractices.com/topic/TopicAction.do?Id=10

person cantas    schedule 04.08.2014