这是我的代码:
> 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;
}
答案 0 :(得分:1)
您实际缺少的是compareTo
是您为对象提供的功能。在您的示例中,您为Person
实例提供了与其他Person
进行比较的功能,以实现该类元素的总排序。
通常这种方法被Lists
,SortedMaps
等JDK集合隐含使用,但是你有一个数组,这是一种原始类型,所以你应该查看Arrays.sort(Object[])
,它会使用Comparable
界面对其进行排序。
提示:由于您的compareTo
方法只适用于String
的{{1}},因此您可以轻松返回其值,而不是检查它的行为方式是否相同。
答案 1 :(得分:0)
首先,在循环外部创建数组。其次,即使家庭作业说明他们只输入10个名字,你也应该假设更多 - 你只是要求那里的IndexOutOfBoundsExceptions。考虑使用像TreeSet这样自动排序的集合。
Person[] people = new Person[10];
// add elements to the array...
java.util.Arrays.sort(people);
first = people[0];
// etc...
要对Collection进行排序(Set是一个没有重复的集合),只需使用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());
答案 2 :(得分:0)
嗯,首先,在最初将更多设置为true之前,您的代码将不会执行任何操作。否则,当您尝试在空对象上调用tostring时,您将只获得空指针异常。
另外,不要在while循环中创建person数组,否则每次都会重置,并且打败了存储所有人的目的。
另外,对于动物园类的对象foo和bar,你不能只做:
foo.compareto(bar);
这就像只有一行代码,如
-4;
Java不喜欢它。
所以,回答你的问题,使用比较方法,就像预先形成真值测验一样。例如
if(foo<bar)
/*Do something*/;
除此之外,你可以使用.compareto()来实际比较对象,而不仅仅是引用。因此,您可以通过比较它们来确定动物园类型的哪个对象更大,foo或bar。用于比较的API规定如果返回0,则它们相等,如果返回正数,则第一个更大,如果返回负数,则第二个更大。所以:
if(foo.compareto(bar) >0)
/* foo is greater*/;
else if(foo.compareto(bar) = 0)
/* foo and bar are equal*/;
else
/* bar is greater*/;