Java中的Bubblesorting对象数组

Java中的Bubblesorting对象数组,java,arrays,sorting,bubble-sort,Java,Arrays,Sorting,Bubble Sort,我试图创建一个方法,根据分配给对象的名称字段,按字母顺序对要显示给用户的对象数组进行冒泡排序。几天来,我一直在胡思乱想,想弄明白这一点,但我这辈子都做不到。我所做的所有研究都没有真正起到作用,尝试了一堆不同的代码,它们似乎都只是停止了程序/给了我更多的问题。所以我想我应该问一下。这就是我现在的工作 public static void sortName(Candidate candidate[]) { int j; boolean finished = true;

我试图创建一个方法,根据分配给对象的名称字段,按字母顺序对要显示给用户的对象数组进行冒泡排序。几天来,我一直在胡思乱想,想弄明白这一点,但我这辈子都做不到。我所做的所有研究都没有真正起到作用,尝试了一堆不同的代码,它们似乎都只是停止了程序/给了我更多的问题。所以我想我应该问一下。这就是我现在的工作

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;
                       } 
               } 
        } 
  } 
这是我的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;
}

我最初在candidateCount增量下面有第一行,因此数组从1开始,而不是从0开始,但这并没有解决问题。我仍然得到一个NPE错误。数组打印得很好,因此数据将进入其中。但我的比较方法似乎出了问题

您不能将值分配给
候选[j].getName()
。没有像C++那样的“L值”,在那里你可以做类似的事情(例如:代码> MyVoal.AT(j)= NealValue;< /Cl> >) 您必须使用类似于
candidate[j].SetName(candidate[j+1].getName())的内容


更好的方法是,通过执行
candidate[j]=candidate[j+1]
来切换整个对象,以避免不尊重,但是否有理由要执行冒泡排序而不是使用内置排序机制?除了相对较小的数据集,冒泡排序的效率非常低


无论如何,您需要记住Java(通常)与对象一起工作,因此您应该交换数组中的对象,而不是尝试切换对象成员。

在为变量分配新值之前,请尝试将变量保存在字符串中

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()方法返回一个字符串,因此整个函数是一个字符串。因此,当您将它放在等式的左侧并尝试修改它时,Java不知道要修改什么。就像说

“示例字符串”=“另一个示例字符串”
而不是

String sampleString = "Sample String";
sampleString = "Another Sample String";

虽然这对您来说应该是可行的,但我个人认为您最好交换数组中的对象。

并且顺便说一句
boolean finished=false;虽然(!finished)
更具可读性…这是有道理的,但我想只切换对象的名称字段会导致更多问题。谢谢。这是一个项目,我们需要使用冒泡排序。只交换局部变量中的名称有什么意义?它不会有任何永久性的效果,因此算法不会对任何东西进行排序!谢谢你的回复,你能看看我的编辑吗?我仍然被这件事缠住了,并且在去哪里的问题上被难住了。你绝对是对的@Waggili我太专注于错误,以至于忘记了排序。我的错。setName可以很好地工作,但正如我提到的,切换对象是最好的解决方案。@Paul我想数组有问题,请仔细检查数组并告诉我。@Iskandarcra我添加了另一个编辑,说明了发生的情况。
String temp = canditate[j].getName();
String firstCandName = candidate[j].getName();
String secondCandName = canditate[j+1].getName();
firstCandName = secondCandName;
secondCandName = temp;
String sampleString = "Sample String";
sampleString = "Another Sample String";