我正在尝试创建一种方法,根据分配给对象的名称字段,按字母顺序对要显示给用户的对象数组进行散列处理。我一直在努力想要解决这个问题几天,而对于我的生活,我不能这样做。我所做的所有研究都没有真正帮助,尝试了一堆不同的代码,他们似乎只是停止程序/给我更多的问题。所以我想我会问。这就是我现在正在使用的。
public static void sortName(Candidate candidate[])
{
int j;
boolean finished = true;
String temp;
while ( finished )
{
finished = false;
for (j=0;j<candidate.length-1;j++)
{
if (candidate[j].getName().compareTo(candidate[j+1].getName())>0)
{
temp = candidate[j].getName();
candidate[j].getName() = candidate[j+1].getName();
candidate[j+1].getName() = temp;
finished = true;
}
}
}
}
if语句中的第2行/第3行给出了错误,说它期望变量但找到一个值。我怀疑这与尝试通过.getName()访问Candidate类中的私有名称字段有关,但我不确定如何做到这一点。有什么帮助吗?
编辑:我现在在下一行中收到NPE错误
if (candidate[j].compareTo(candidate[j+1])>0)
这是我的Candidate课程中的compareTo方法。
public int compareTo(Candidate candidate)
{
int candidateCompare = this.getName().compareTo(candidate.getName());
if (candidateCompare != 0)
return candidateCompare;
else{
if (this.getName().compareTo(candidate.getName()) < 0)
return -1;
if (this.getName().compareTo(candidate.getName()) > 0)
return 1;
}
return 0;
}
我不明白为什么会发生这种情况,尝试研究解决方案但没有找到任何帮助。
编辑2:我的do-while循环中有以下几行,我获取了我班级数据字段的用户输入。在此循环中,将创建一个包含数据的新对象,并将其分配给名为origCandidateList的对象数组。这是代码。
origCandidateList[candidateCount] = new Candidate(candidateName, candidateAge, candidateParty, candidateIssue);
candidateCount++;
我最初的第一行低于candidateCount增量,因此数组从1开始而不是0,但这并没有解决问题。我仍然遇到NPE错误。数组打印出来很好,所以数据进入它。但是我的compareTo方法似乎出现了问题。
答案 0 :(得分:2)
您无法为candidate[j].getName()
指定值。在C ++中没有“L值”,你可以在那里做类似的事情(例如myVector.at(j) = newValue;
)。
您必须使用candidate[j].SetName(candidate[j+1].getName());
更好的是,通过candidate[j] = candidate[j+1]
切换整个对象。
答案 1 :(得分:0)
不是不尊重,但是有没有理由想要进行冒泡排序而不是使用内置排序机制?对于除了相对较小的数据集之外的任何东西,冒泡排序都是非常低效的。
无论如何,您需要记住Java(通常)使用对象,因此您应该交换数组中的对象,而不是尝试切换对象成员。
答案 2 :(得分:0)
尝试在为其分配新值之前将变量保存在String中。
String temp = canditate[j].getName();
String firstCandName = candidate[j].getName();
String secondCandName = canditate[j+1].getName();
firstCandName = secondCandName;
secondCandName = temp;
例如candidate[j].getName() = temp
不起作用的原因是因为candidate[j].getName()
不是变量,并且参数的左侧应该是变量,因此这会给你一个错误。尝试做我上面做的事应该适合你。
只是为了澄清我的意思candiate[j].getName()
不是变量。 getName()方法返回一个String,因此整个函数是一个String。因此,当您将它放在相等的左侧并尝试修改它时,Java将不知道要修改的内容。就像说
"Sample String" = "Another Sample String"
代替,
String sampleString = "Sample String";
sampleString = "Another Sample String";
虽然这对你有用,但我个人认为你最好不要在数组中交换对象。