对于我的AP CSA分配,我必须先输入一个名称,然后输入一个ID,这两个都是字符串。然后他们希望我使用compareTo()对值进行排序。问题是,当我尝试使用compareTo()时,它总是抛出空指针异常。第一个值始终为null(使用System.out.println()找到它以查看正在比较的值),但我无法找出为什么它为null。
这是我的主班:
import java.util.Scanner;
import java.util.ArrayList;
public class Main {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
ArrayList<TeamMember> members = new ArrayList<TeamMember>();
String name = "";
while(true)
{
System.out.println("Enter the next name:");
name = scan.nextLine();
if(name.toUpperCase().equals("STOP"))
{
break;
}
System.out.println("Enter the next ID:");
String id = scan.nextLine();
members.add(new TeamMember(name,id));
}
for(int i = 0; i < members.size() - 1; i++)
{
System.out.println(members);
TeamMember temp = members.get(i);
for(int j = i + 1; j < members.size(); j++)
{
System.out.println(members.get(i) + " " + members.get(j));
if(members.get(i).compareTo(members.get(j)) < 0)
{
members.add(i, members.remove(j));
members.set(j, temp);
}
}
}
}
}
这是我的TeamMember班:
public class TeamMember implements Comparable<TeamMember>{
String fullName;
String idString;
public TeamMember(String name, String id){
name = name.toUpperCase();
boolean findspace = false;
for(int i = 0; i < name.length(); i++)
{
if (name.charAt(i) == ' ')
{
findspace = true;
break;
}
}
if(findspace)
{
String string1 = name.substring(0, 1) + name.substring(1, findSpace(name)).toLowerCase();
String string2 = name.substring(findSpace(name) + 1, findSpace(name) + 2) + name.substring(findSpace(name) + 2).toLowerCase();
fullName = string1+ " " + string2;
idString = id;
}
else
{
fullName = name.charAt(0) + name.substring(1).toLowerCase();
}
}
private int findSpace(String name){
for(int j = 0; j < name.length(); j++){
if (name.charAt(j) == ' '){
return j;
}
}
return 0;
}
public String toString(){
return fullName;
}
@Override
public int compareTo(TeamMember other){
return this.idString.compareTo(other.idString);
}
}
我知道我的排序可能是错误的,但是我无法进行测试,因为compareTo()使我感到困惑。
这是他们希望我们尝试的测试用例:
Enter the next name:
zeb
Enter the next ID:
02-003
Enter the next name:
rita stevens
Enter the next ID:
01-001
Enter the next name:
SUE wOOds
Enter the next ID:
02-001
Enter the next name:
adele
Enter the next ID:
01-002
Enter the next name:
BarBara
Enter the next ID:
02-002
Enter the next name:
STOP
在TeamMember
构造函数中,当idString
的值为'False'时,您没有为findspace
变量分配任何值。并且由于您的比较适用于idString
,因此它为您提供了“ nullpointerexception”。您可能只需要按以下方式更新代码:
if(findspace)
{
String string1 = name.substring(0, 1) + name.substring(1, findSpace(name)).toLowerCase();
String string2 = name.substring(findSpace(name) + 1, findSpace(name) + 2) + name.substring(findSpace(name) + 2).toLowerCase();
fullName = string1+ " " + string2;
//idString = id; // Moving this assignment outside if-block
}
else
{
fullName = name.charAt(0) + name.substring(1).toLowerCase();
}
idString = id;
该错误在TeamMember类中。您需要移动“ idString = id;”超出“ if(findspace){...}”块。这是“ TeamMember”类的固定代码:
public class TeamMember implements Comparable<TeamMember> {
String fullName;
String idString;
public TeamMember(String name, String id) {
name = name.toUpperCase();
idString = id;
boolean findspace = false;
for (int i = 0; i < name.length(); i++) {
if (name.charAt(i) == ' ') {
findspace = true;
break;
}
}
if (findspace) {
String string1 = name.substring(0, 1) + name.substring(1, findSpace(name)).toLowerCase();
String string2 = name.substring(findSpace(name) + 1, findSpace(name) + 2)
+ name.substring(findSpace(name) + 2).toLowerCase();
fullName = string1 + " " + string2;
} else {
fullName = name.charAt(0) + name.substring(1).toLowerCase();
}
}
private int findSpace(String name) {
for (int j = 0; j < name.length(); j++) {
if (name.charAt(j) == ' ') {
return j;
}
}
return 0;
}
public String toString() {
return fullName;
}
@Override
public int compareTo(TeamMember other) {
return this.idString.compareTo(other.idString);
}
}