【问题标题】:How can I sort an array of objects manually? Without utilizing the included sorting methods in the Array class?如何手动对对象数组进行排序?不使用 Array 类中包含的排序方法?
【发布时间】:2021-06-17 09:07:33
【问题描述】:

我对 Java 还是很陌生,这是我第一次使用 Stack Overflow,请多多包涵。

我正在用一组对象制作一个程序,在这个例子中,我正在制作一组甜点。每个甜点都有一个随机生成的整数“等级”。我们必须做的程序的一部分是对对象数组进行排序,而不使用 Array 类中包含的排序方法。我查找了一个如何使用整数对基本数组进行排序的典型示例,并尝试将其合并到我的代码中的甜品排序方法中。当我运行它时,数组不会改变......

import java.util.Random;

public class Desserts {

    public static void main(String[] args) {
        DessertTerms[] yum;
        yum = new DessertTerms[5];
        Random random = new Random();
        
        yum[0] = new DessertTerms("Chocolate cupcakes",random.nextInt(100));
        yum[1] = new DessertTerms("Vanilla blondies",random.nextInt(100));
        yum[2] = new DessertTerms("blackberry cobbler",random.nextInt(100));
        yum[3] = new DessertTerms("apple pie",random.nextInt(100));
        yum[4] = new DessertTerms("glazed donuts",random.nextInt(100));
        

        for (int i = 0; i < yum.length; i++) {
            System.out.println(yum[i].getName() + " " + yum[i].getRank());
         }
        
        dessertSort(yum);
        
    }
        
        public static void dessertSort(DessertTerms[] goods) {
            for (int j = 1; j > goods.length; j++) {
                DessertTerms current = goods[j];
                int i = j - 1;
                while ((i > 1) && (goods[i].getRank() > current.getRank())) {
                    goods[i + 1] = goods[i];
                    i--;
                }
                goods[i + 1] = current;
             }
            System.out.println("\nSorted stuff....");

            for (int i = 0; i < goods.length; i++) {
                System.out.println((i+1) + " " + goods[i].getName() + " " + goods[i].getRank());
             }
        
    }

}

DessertTerms 类:

public class DessertTerms {
          private String name = "xxxxx"; //default name for dessert
          private int rank = 0; //default rank
          
          DessertTerms(){
              
          }
          
          public DessertTerms(String name, int rank) {
                this.name = name;
                this.rank = rank;
              }
         
          
          public String getName() {

              return name;
            }

          public void setName(String newName) {

              this.name = newName;
            }
          
          public int getRank(){
                return rank;
            }

          public void setRank(int newRank){
            this.rank = newRank;
            }
          
          @Override 
          public String toString() {
              return this.name + " " + this.rank;
          }
}

这是输出:

Before sort......
Chocolate cupcakes 82
Vanilla blondies 60
blackberry cobbler 3
apple pie 91
glazed donuts 91

After sort....
Chocolate cupcakes 82
Vanilla blondies 60
blackberry cobbler 3
apple pie 91
glazed donuts 91

我可以看出我做错了,但我不知道是什么。

【问题讨论】:

  • 您被要求实现自己的排序算法。在线复制代码或让 StackOverflow 上的人为您解决这个问题不会帮助您学习。
  • 无论你的排序实现是否正确,使用j &gt; goods.length的循环条件不会完成太多工作!
  • dessertSort 内,你的外循环有一个错误的结束条件。改为j &lt; goods.length
  • 你的while 循环也不会运行,它会用货物[i]覆盖所有货物。最好检查一个排序算法并尝试实现它。

标签: java arrays sorting object


【解决方案1】:

尝试使用Collections.sort()

Collections.sort(yum, (a, b) -> Integer.compare(a.getRank(), b.getRank()));

【讨论】:

  • 操作说没有内置排序
  • 其实它只提到了 Array 类,并不排除其他内置排序。 @GoldRose19 您的问题与排序对象有关,还是与排序算法的实际实现有关?
  • 这很公平,是的,可能更好地询问 op。我把它解释为没有像 Array 类那样的内置方法。
  • 正确 - 我不得不重新阅读我们的说明,但它只具体说明了“Array 类中提供的排序方法”。即使就我自己的知识而言,我也想知道如何手动完成。所以为此我会说这是实际的实现。
【解决方案2】:

我想我实际上是在一些修补之后才弄明白的。我采用了一个简单的选择排序算法,它奏效了:

public static void dessertSort(DessertTerms[] goods) {
        int n = goods.length; 
        for (int i = 0; i < n; i++) {
            int min_rank = i;
            for (int j = i + 1; j < n; j++)
                if (goods[j].getRank() < goods[min_rank].getRank())
                    min_rank = j;
            
            DessertTerms temp = goods[min_rank];
            goods[min_rank] = goods[i];
            goods[i] = temp;
            System.out.println(goods[i].toString());
        }
}

输出:

apple pie 3
Chocolate cupcakes 68
blackberry cobbler 86
glazed donuts 93
Vanilla blondies 95

我用作原始错误代码指南的搜索算法可能不适合我试图完成的任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多