【问题标题】:Bubblesorting Object Array in JavaJava中的冒泡排序对象数组
【发布时间】:2015-09-15 18:20:23
【问题描述】:

我正在尝试创建一种方法,根据分配给对象的名称字段对要按字母顺序显示给用户的对象数组进行冒泡排序。几天来,我一直在尝试解决这个问题,而我这辈子做不到。我所做的所有研究都没有真正帮助,尝试了一堆不同的代码,它们似乎都只是停止程序/给我更多问题。所以我想我会问。这就是我现在正在使用的。

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() 访问候选类中的私有名称字段有关,但我不确定如何做到这一点。有什么帮助吗?

编辑:我现在在以下行收到 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++;

我最初在候选计数增量下方有第一行,因此数组从 1 而不是 0 开始,但这并没有解决问题。我仍然收到 NPE 错误。数组打印得很好,所以数据正在进入它。但是我的 compareTo 方法似乎出了点问题。

【问题讨论】:

  • 和 BTW boolean finished = false; while (!finished) 更具可读性...

标签: java arrays sorting bubble-sort


【解决方案1】:

您不能为candidate[j].getName() 赋值。没有像 C++ 中那样的“L 值”,您可以在其中做类似的事情(例如 myVector.at(j) = newValue;)。

你必须使用candidate[j].SetName(candidate[j+1].getName());之类的东西

更好的是,通过 candidate[j] = candidate[j+1] 切换整个对象。

【讨论】:

  • 有道理,我猜只切换对象的名称字段会导致更多问题。谢谢。
【解决方案2】:

不要失礼,但是您是否有理由要进行冒泡排序而不是使用内置排序机制?除了相对较小的数据集之外,冒泡排序对于任何东西都非常低效。

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

【讨论】:

  • 这是一个项目,需要我们使用冒泡排序。
【解决方案3】:

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

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 将不知道要修改什么。就像在说

"Sample String" = "Another Sample String" 而不是,

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

虽然这应该对你有用,但我个人认为你最好交换数组内的对象。

【讨论】:

  • 只在局部变量中交换名称有什么意义?它不会产生任何永久性影响,因此算法根本不会对任何东西进行排序!
  • 感谢您的回复,您能查看我的编辑吗?我仍然被这件事所困扰,并且完全不知道该去哪里。
  • 你是绝对正确的@Waggili 我太专注于我忘记排序的错误。我的错。 setName 然后可以正常工作,但正如我提到的,切换对象是最好的解决方案。
  • @Paul 我想阵列有问题,请仔细检查您的阵列并告诉我。
  • @iskandarchacra 我添加了另一个关于正在发生的事情的编辑。
猜你喜欢
  • 1970-01-01
  • 2012-04-14
  • 2021-06-10
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 2023-04-01
  • 2021-09-16
  • 2020-04-21
相关资源
最近更新 更多