该计划的目标是根据人员的出生日期对他们进行排序。
import static java.lang.System.*;
public class Person implements Comparable<Person>
{
private int myYear;
private int myMonth;
private int myDay;
private String myName;
public Person( int y, int m, int d, String n)
{
myYear=y;
myMonth=m;
myDay=d;
}
public int compareTo( Person other )
{
if(other.myYear>this.myYear)
return 1;
if(other.myYear<this.myYear)
return -1;
if(other.myMonth>this.myMonth)
return 1;
if(other.myMonth<this.myMonth)
return -1;
if(other.myDay>this.myDay)
return 1;
if(other.myDay<this.myDay)
return -1;
return(other.compareTo(this.myName));
}
@Override
public String toString() {
return "Person{" + "myYear=" + myYear + ", myMonth=" + myMonth + ", myDay=" + myDay + ", myName=" + myName + '}';
}
}
}
这里是我遇到麻烦的跑步者...返回的只是[]。
import static java.lang.System.*;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Collections;
import static java.lang.System.*;
public class PersonRunner
{
public static void main ( String[] args ) throws IOException
{
Scanner person=new Scanner("person.dat");
ArrayList list=new ArrayList();
ArrayList list2=new ArrayList();
person.nextLine();
while(person.hasNextLine()){
list.add(new Person(person.nextInt(),person.nextInt(),person.nextInt(),person.next()));
}
list2=list;
for(int i=0;i<list.size()-1;i++){
if(list.get(i).compareTo(list.get(i+1)))==1){
list2[i].set(list.get(i));
}
}
System.out.println(list2);
}
}
有一个主要的.dat文件正在读取,其中列出了测试用例/信息...
12
50 20 10 MARK
10 40 20 JACK
50 30 3 JAMES
3 50 2 JOANN
10 40 20 TOMMY
40 90 11 ANN
3 50 2 SALLY
3 50 5 FRED
11 11 11 DOUG
5 25 50 ED
10 10 1 ELTON
1 1 3 LINH
将不胜感激。我正在为一个班级做这个问题,所以我想要的只是基本的编码帮助,不应该太高级了……谢谢大家的回答。
答案 0 :(得分:1)
好的,所以您会遇到很多编译器和逻辑错误...
if(list.get(i).compareTo(list.get(i+1)))==1){
是错误的,==1)
在if (...)
块的上下文之外,您有一两个很多的右括号。
这也是错误的,因为get
将返回没有Object
方法的compareTo
。
您似乎在代码末尾还有一个额外的}
括号,这将使所有内容搞砸。
public Person(int y, int m, int d, String n) {
myYear = y;
myMonth = m;
myDay = d;
}
您永远不会分配n
或myName
,而这将导致潜在的NullPointerException
。
Scanner reader = new Scanner("person.dat");
将创建一个Scanner
,它将解析String
person.dat
而不加载文件。
可能还有其他几个,但老实说,我扔了很多东西。
return (other.compareTo(this.myName));
是错误的,因为您尝试将Person
的实例与String
进行比较,应该是...
return (other.myName.compareTo(this.myName));
让我们从Scanner
开始。您需要更具体地说明您希望Scanner
使用的数据源。在这种情况下,您想读取File
...
Scanner reader = new Scanner(new File("person.dat"));
接下来,利用Java中的通用支持为List
s的内容提供更多上下文...
ArrayList<Person> list = new ArrayList<>();
这将使它更易于管理,并且在从List
检索对象时无需铸造对象
我个人将读取文件的每一行,并使用第二个Scanner
来解析各行。
while (reader.hasNextLine()) {
String text = reader.nextLine();
Scanner parser = new Scanner(text);
list.add(new Person(parser.nextInt(), parser.nextInt(), parser.nextInt(), parser.next()));
}
说实话,我不知道是什么...
list2=list;
for(int i=0;i<list.size()-1;i++){
if(list.get(i).compareTo(list.get(i+1)))==1){
list2[i].set(list.get(i));
}
这是在做的,并且由于有一种更简便的执行方法,因此我将其删除并替换为...
Collections.sort(list);
for (Person p : list) {
System.out.println(p);
}
还有更新的Person
类...
public class Person implements Comparable<Person> {
private int myYear;
private int myMonth;
private int myDay;
private String myName;
public Person(int y, int m, int d, String n) {
myYear = y;
myMonth = m;
myDay = d;
myName = n;
}
public int compareTo(Person other) {
if (other.myYear > this.myYear) {
return 1;
}
if (other.myYear < this.myYear) {
return -1;
}
if (other.myMonth > this.myMonth) {
return 1;
}
if (other.myMonth < this.myMonth) {
return -1;
}
if (other.myDay > this.myDay) {
return 1;
}
if (other.myDay < this.myDay) {
return -1;
}
return (other.myName.compareTo(this.myName));
}
@Override
public String toString() {
return "Person{" + "myYear=" + myYear + ", myMonth=" + myMonth + ", myDay=" + myDay + ", myName=" + myName + '}';
}
}