Как отсортировать массив объектов Person с помощью compareto ()? - PullRequest
0 голосов
/ 01 апреля 2010

Вот мой код:

> import java.util.Scanner;
  import java.util.Arrays;

  /**
  This class tests the Person class.
  */
  public class PersonDemo
   {
    public static void main(String[] args)
    {
    int count = 0;
    Scanner in = new Scanner(System.in);

    boolean more = false;
    Person first = null;
    Person last = null;
    while (more)
    {
      System.out.println(
          "Please enter the person's name or a blank line to quit");
      String name = in.nextLine();

      if (name.equals(""))
       more = false;
      else
      {
       Person p = new Person(name); //new person object created with inputted name

       Person[] people = new Person[10]; //new array of 10 person objects
       people[count] = p; //declare person object with index of variable count as the new person object                            

       first = people[count];  // I have no idea what to do here.  This is where I'm stuck.
       last = people[count];   // I can't figure out what to do with this either.

       first.compareTo(p); //call compareTo method on first and new person object
       last.compareTo(p);  //call compareTo method on last and new person object     

       count++; // increase count variable
      }
     }

      System.out.println("First: " + first.toString()); 
      System.out.println("Last: " + last.toString());
     }
   }

И класс Person:

/**
  A person with a name.
*/
public class Person implements Comparable

{
 /**
  * Constructs a Person with a name.
  * @param aName the person's name
  */
 public Person(String aName)
 {
  name = aName;
 }

 public String getName()
 {
  return name;
 }

 @Override
 public int compareTo(Object otherObject) 
 {
  Person other = (Person)otherObject;
  if (name.compareTo(other.name) < 0) return -1;
  if (name.compareTo(other.name)  > 0) return 1;  
  return 0;
 }

 /**
        Returns a string representation of the object.
        @return name of Person
 */
 public String toString()
 {
  return "[name=" + name + "]";
   }

 private String name; 

}

Ответы [ 3 ]

1 голос
/ 01 апреля 2010

Чего вам действительно не хватает, так это того, что compareTo - это функциональность, которую вы даете объектам.В вашем примере вы предоставляете экземпляру Person возможность сравнения с другими Person для достижения общего порядка элементов этого класса.

Обычно этот метод неявно используетсяпо коллекциям JDK, таким как Lists, SortedMaps и т. д., но у вас есть массив , который является своего рода примитивным типом, поэтому вы должны взглянуть на Arrays.sort(Object[]), который позаботится о порядке его использованияинтерфейс Comparable.

Подсказка: поскольку ваш метод compareTo просто работает с String из Person, вы можете легко просто вернуть его значение, вместо того, чтобы проверять его поведение таким же образом..

0 голосов
/ 01 апреля 2010

Ну, во-первых, ваш код ничего не будет делать, пока вы не установите больше true на начальном этапе. В противном случае вы просто получите исключение нулевого указателя при попытке вызвать tostring для нулевого объекта.

Кроме того, не создавайте массив person в цикле while, иначе он будет каждый раз сбрасываться и уничтожать то, что, как представляется, является целью хранения всех людей.

Также, учитывая объекты foo и bar класса zoo, вы не можете просто сделать:

foo.compareto(bar);

Это было бы как строка кода типа

-4;

Java это не нравится.

Таким образом, отвечать на ваш вопрос, используя сравнение с методами, похоже на тесты на истинность преформ. Например

if(foo<bar)
     /*Do something*/;

Кроме того, вы можете использовать .compareto (), чтобы сравнивать объекты, а не просто ссылки. Таким образом, вы можете определить, какой объект типа zoo больше, foo или bar, сравнивая их со сравнением с. API для Compareto предусматривает, что если возвращается 0, то они равны, если возвращается положительное число, первое больше, а если возвращается отрицательное число, второе больше. Итак:

if(foo.compareto(bar) >0)
    /* foo is greater*/;
else if(foo.compareto(bar) = 0)
    /* foo and bar are equal*/;
else
    /* bar is greater*/;
0 голосов
/ 01 апреля 2010

Прежде всего, получите создание вашего массива вне цикла. Во-вторых, даже если в задании на домашнюю работу сказано, что они введут только 10 имен, вы должны предположить больше - вы просто запрашиваете там исключения IndexOutOfBoundsException. Попробуйте использовать коллекцию типа TreeSet , которая сортирует автоматически.

К сортировка массива :

Person[] people = new Person[10];
// add elements to the array...
java.util.Arrays.sort(people);
first = people[0];
// etc...

Чтобы отсортировать коллекцию (набор представляет собой коллекцию без дубликатов), просто используйте TreeSet, и они сортируются автоматически.

TreeSet<Person> people = new TreeSet<Person>(); // using generics to say "only Person objects are allowed"
while (more) {
    System.out.println("Please enter the person's name or a blank line to quit");
    String name = in.nextLine();

    if (name.equals(""))
        more = false;
    else
        people.add(new Person(name));
}

System.out.println("First: " + people.first()); 
System.out.println("Last: " + people.last());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...