程序运行时什么都不做?

时间:2014-12-10 04:05:23

标签: java arrays sorting search runtime

我编写了这个程序并拥有它应该需要的所有代码。起初我遇到了一些运行时错误,但我很容易修复它们。现在它没有显示任何可见错误,当我运行它时,它什么也没做。

从本质上讲,它应该做的是打印出一个包含学生和id号的类列表,这些类已经从两个文件合并而来。它将学生的ID与类的ID相匹配,并将它们组成一个列表。这一切似乎都在发生,它只是不打印出来。

我的代码如下。请让我知道你在想什么。我在顶部包含了一个描述,以及我认为问题的开始和结束的标记。在代码之后还有一个两个文件内容的例子。

/* This program reads in two files, one which contains a list of student names and id numbers,     and another which lists class id numbers.
 * Then, the data is taken into arrays which are then used in different sorts. One sorts the id numbers numerically, one sorts the students
 * alphabetically, and one sorts the class names alphabetically.The id numbers of students are matched to class and both are compiled into
 * a list which then prints out first the class name, then the list of students within it. All done alphabetically.
 * 
 */

import java.io.*;
import java.util.Scanner;

public class MergingFiles {

  public static void main(String[] args) throws IOException { 
    String[][] studentArray = new String [1000][2];
    String[][] classArray = new String[4000][2];
    int count = 0;

    Scanner sc = new Scanner(new File("students.txt"));
    while(sc.hasNextLine()){
     String studentInput = sc.nextLine();
     String name = studentInput.substring(0, 30).trim();
     String id = studentInput.substring(30).trim();
     studentArray[count][0] = name;
     studentArray[count][1] = id;
     count++;
    }
     for(int i = 0; i < count-1; i++){ //sorts id number numerically
      for(int j = 0; j < count-1-i; j++){
        if(studentArray[j][1].compareTo(studentArray[j+1][1]) > 0){
         String holder = studentArray[j][1];
          studentArray[j][1] = studentArray[j+1][1]; 
          studentArray[j+1][1] = holder; 
        }
      }
     }
     int counter3 = 0;
     Scanner sc2 = new Scanner(new File("classes.txt"));
     while(sc2.hasNextLine()){
       int counter2 = 0;
       String classInput = sc2.nextLine(); 
       while(classInput.charAt(counter2)!= ' '){
         counter2++;
       }
       String className = classInput.substring(0, counter2);
       while(classInput.charAt(counter2) == ' '){
         counter2++;
       }
       String idNum = classInput.substring(counter2);


       int low = 0;
       int high = count - 1;
       int mid = (high - low)/2 + low;

       while(!idNum.equals(studentArray[mid][1])){ //binary search
         if(idNum.compareTo(studentArray[mid][1]) < 0){
           high = mid - 1; 
         }else
           low = mid + 1;
         mid = (high - low)/2 + low;
       }

       String studentName2 = studentArray[mid][1];
       classArray[counter3][0] = className;
       classArray[counter2][1] = studentName2;
     }
 //I THINK THE ISSUE STARTS HERE
     for(int a = 0; a < (counter3 - 1); a++){ //sort class names alphabetically
       for(int b = 0; b < counter3-1-a; b++){
         if(classArray[b][0].compareTo(classArray[b+1][0]) > 0){
           String holder2 = classArray[b][0];
           classArray[b][0] = classArray[b+1][0]; 
           classArray[b+1][0] = holder2; 
         }
       }
     }
     for(int c = 0; c < (counter3 - 1); c++){ //sort class names alphabetically
       for(int d = 0; d < counter3-1-c; d++){
         if((classArray[d][0].compareTo(classArray[d+1][0])) == 0){
           if(classArray[d][1].compareTo(classArray[d+1][1]) > 0){
             String holder3 = classArray[d][1];
             classArray[d][1] = classArray[d+1][1]; 
             classArray[d+1][1] = holder3; 
           }
         }
       }
     }
     String currentClass = "";
     for(int s = 0; s < counter3; s++){
       if(!classArray[s][0].equals(currentClass)){
         currentClass = classArray[s][0];
         System.out.print(currentClass);
       }
       System.out.print(classArray[s][1]);
     }
 //THIS IS WHERE THE ISSUE ENDS 
  }                         
}

studentArray内容示例(不含//&#39; s):

//Lambert, Desmond              451825335
//Johnston, Michaela            143547061
//Wells, Shirley                942366473
// Blevins, Dawson               407183976
// Roy, Benjamin                 575069268
// Mitchell, Jaquan              285633099
// Freeman, Nayeli               312234364
// Benson, Myles                 755491358
// Wilkinson, Stephany           384506082
// Bradshaw, Nikki               159900631
// Davila, Sarah                 788743448
// Wyatt, Eddie                  253830483
// Ortega, Josh                  891761169
// Pruitt, Deven                 533987743
// Harrison, Aliyah              710258372
// Perez, Emerson                611325979
// Stanton, Sonny                430095944
// Rice, Bruce                   301915859
// Callahan, Brandon             327995163
// Torres, Jovan                 629852538
// Mathis, Timothy               936191071
// Calhoun, Nathanael            107519769
// Mullen, Malik                 711847273
// Sims, Marvin                  519717164
// Pham, Siena                   530779316
// Vincent, Demetrius            618276821

classArray内容示例(不含//&#39; s):

 //ECON101 938597595
 //BUS100 951008337
 //ECON408 620903271
 //PHY101 695451867
 //COSC150 392023624
 //MATH215 557048539
 //COSC325 495522117
 //BUS215 185642398
 //ECON408 807662685
 //MATH215 920062540
 //MATH325 517786537
 //PHY150 915173832
 //BUS100 518392974
 //BUS408 410797598
 //BUS215 152414047
 //PHY150 561839967

感谢。

2 个答案:

答案 0 :(得分:0)

我认为你应该在txt文件中添加标记,并且使用StringTokenizer在数组中每行捕获一列。一旦获得了数组中的所有数据,那么您应该处理要合并的数据。   当您说“学生的身份证号码与班级相匹配,并且两者都被编入一个列表,然后首先打印出班级名称,然后是其中的学生列表。所有这些都按字母顺序完成。”   您打算将student文件中的id与类文件进行匹配吗?如果是这样,上面的示例值不会显示它。

此外,如果您有student和classtxt文件,请分享这些文件,我可以尝试使用它们。

答案 1 :(得分:0)

基本问题是,counter3永远不会设置为除0之外的任何内容,因此打印循环的主体永远不会执行。你可能想在这里增加counter3,并且还使用它作为这两个赋值语句的classArray的索引(我认为你错误地使用counter2设置学生名称):

classArray[counter3][0] = className;
classArray[counter2][1] = studentName2;
counter3++;

顺便说一句,你的排序被打破了,因为你正在对学生ID进行排序而不对其名称进行排序 - 确保将整个学生[](studentArray[i])改为前进,而不仅仅是studentArray[i][1] 。以下是使用Arrays.sort(T[] a, Comparator<? super T> c)

的工作示例
// sort students by id number and sort null elements to end of array
Arrays.sort(studentArray, new Comparator<String[]>() {
    public int compare(String[] student1, String[] student2)
    {
        if (student1[1] == null) return 1;
        if (student2[1] == null) return -1;
        return student1[1].compareTo(student2[1]);
    }
});