我的生日分拣运行程序有什么问题?

时间:2018-11-12 02:55:40

标签: java

该计划的目标是根据人员的出生日期对他们进行排序。

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

将不胜感激。我正在为一个班级做这个问题,所以我想要的只是基本的编码帮助,不应该太高级了……谢谢大家的回答。

1 个答案:

答案 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;
}

您永远不会分配nmyName,而这将导致潜在的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 + '}';
  }

}