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

1

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

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

Напишите класс 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 в зависимости от того, является ли текущий объект меньшим, большим или равным объекту, с которым он сравнивается. Однако, как вы можете видеть из примера output, вместо того, чтобы отображать это целочисленное значение, я должен отображать что-то вроде "Первое меньше". Я уверен, что это нужно, мне нужно было бы присвоить возвращаемое значение переменную, а затем использовать инструкции if для определения того, что должно быть напечатано, но мне трудно понять, как и в какой момент моего кода это нужно сделать?

  • 4
    compareTo() не должно возвращать только -1 , 0 или 1 . Он просто должен вернуть отрицательное значение int , 0 или положительное значение int .
  • 0
    Правильно, я в основном имею в виду, что он должен возвращать int, а не вывод, который мне нужно отображать.
Показать ещё 1 комментарий
Теги:
comparable
compareto

2 ответа

1
Лучший ответ

Основываясь на этой строке вашего требования: In addition, your program should compare the current object (just read in) with the first object read in. Вот какой код для этого. В основном это читает Octagon до тех пор, пока не будет прочитано отрицательное число, и сравнивает каждый из них с первым 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();
}
  • 0
    Спасибо! Единственная проблема, с которой я сейчас сталкиваюсь, заключается в том, что это не печать области или периметра. Вывод выглядит следующим образом: Octagon 1: «Octagon @ 134bed0» Octagon 2: «Octagon @ 1db4f6f», больше, чем первый Octagon 3: «Octagon @ 13c1b02», меньше, чем первый Octagon 4: «Octagon @ 11121f6», меньше, чем первый
  • 0
    Проверьте мою правку. (Я изменил первый System.out.print иметь oct.toString() вместо того , чтобы просто oct .) Тем не менее, я не знаю , почему вы с этой проблемой , так как вы сделали перегрузку Object.toString() .
Показать ещё 2 комментария
0

int compareTo (Object o)

или

int compareTo (String anotherString)

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню