我编写了这个程序并拥有它应该需要的所有代码。起初我遇到了一些运行时错误,但我很容易修复它们。现在它没有显示任何可见错误,当我运行它时,它什么也没做。
从本质上讲,它应该做的是打印出一个包含学生和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
等
感谢。
答案 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]);
}
});