如何使用以下代码根据实例变量对对象数组进行升序排序

Posted

技术标签:

【中文标题】如何使用以下代码根据实例变量对对象数组进行升序排序【英文标题】:How to sort object array in ascending order based on instance variables using the following code 【发布时间】:2017-06-20 00:23:38 【问题描述】:

我试图在没有比较器或数组列表的情况下对该对象数组进行排序。对数组进行排序以获得平均分数。如果有人能给我一个有用的想法,我真的不想使用数组列表或比较器,所以我想我需要算法来帮助我,但我正在努力找出一个版权保留给德文·安德伍德:

public void calcAvgScore()

    avgScore = (test1 + test2) / 2;   

那么在构造函数中是:

 public Student(String newName, int newId, int newTest1, int newTest2)
 
    super(newName, newId);
    test1 = newTest1;
    test2 = newTest2;
    calcAvgScore();
    calcGrade();

然后:

  public static void main(String[] args)

    Student[] score = new Student[5];

    Scanner keyboard = new Scanner(System.in);

    System.out.println("Please enter your students first name, id number, and two test scores");
    String newName = keyboard.next();
    int newId = keyboard.nextInt();
    int newTest1 = keyboard.nextInt();
    int newTest2 = keyboard.nextInt();

    Student student1 = new Student(newName, newId, newTest1, newTest2);

    System.out.println("Please enter your second students first, id number and two test scores");
    String newName2 = keyboard.next();
    int newId2 = keyboard.nextInt();
    int newTest12 = keyboard.nextInt();
    int newTest22= keyboard.nextInt();

    Student student2 = new Student(newName2, newId2, newTest12, newTest22);

    System.out.println("Please enter your third students first name, id number, and two test scores");
    String newName3 = keyboard.next();
    int newId3 = keyboard.nextInt();
    int newTest13 = keyboard.nextInt();
    int newTest23= keyboard.nextInt();

    Student student3 = new Student(newName3, newId3, newTest13, newTest23);

    System.out.println("Please enter your fourth students first name, id number, and two test scores");
    String newName4 = keyboard.next();
    int newId4 = keyboard.nextInt();
    int newTest14 = keyboard.nextInt();
    int newTest24= keyboard.nextInt();

    Student student4 = new Student(newName4, newId4, newTest14, newTest24);

    System.out.println("Please enter your fifth students first name, id number, and two test scores");
    String newName5 = keyboard.next();
    int newId5 = keyboard.nextInt();
    int newTest15 = keyboard.nextInt();
    int newTest25= keyboard.nextInt();

    Student student5 = new Student(newName5, newId5, newTest15, newTest25);

    score[0] = student1;
    score[1] = student2;
    score[2] = student3;
    score[3] = student4;
    score[4] = student5;
    System.out.println("____________");

     max = score[0];
    int i;
    for(i =0; i < score.length; i++)
    

        System.out.println(score[i]);

        System.out.println("____________");
    


【问题讨论】:

与问题无关,但我建议您编写一个函数Student createStudentFromUserInput(),它读取所有需要的值,创建一个新的学生对象并返回它——您将在示例中保护 25 行. 【参考方案1】:

就像这样:您可以不使用Comparator 进行排序,而是您自己实现它。换句话说,实际上你不能。据我所知,算法无法帮助你。如果没有平均分,如何填充数组进行排序?

    保存Student 班级的平均成绩,就像你做的那样。 (尽管我认为您可能必须更改构造函数。最好提供Student 类的详细信息。) 您使用student.avgScore 进行排序。

喜欢:

max = score[0];
int x = 0;
Student temp = null;
for (int i=0; i < score.length; i++) 
    x = score[i].avgScore;
    temp = score[i];
    if (x < score[i+1].avgScore ) 
        score[i] = score[i+1];
        score[i+1] = temp;
    

只是一个粗略的想法。算法加快了排序,但您使用实际数据进行排序。

【讨论】:

我把它改成了这个,以便我的程序更适合这个学生 max = score[0];双 x = 0; for (int i=0; i 对不起,我没有运行我的代码。我已经编辑了我的答案。关键是我们交换数组中的元素,而不是doubleStudent。您是否使用文本编辑器而不是像 Eclipse 这样的 IDE 进行编码? IDE应该会检测到这种错误。【参考方案2】:

假设您选择了必要的排序算法分区排序、合并排序等。关键是您有一个数组,并且您希望交换数组中的元素以使排序工作。鉴于 java 按值传递 编写一个方法,将数组元素作为 score[i] 和 score[j] 传递给它不会给你所需的效果。 像下面这样的东西对调用者没有任何影响

Student sArr[] = ...

swap(sArr[i], sArr[j])

但是,您可以将引用传递给要交换的数组和索引,如下所示

Student sArr[] = ...

swap(sArr, i, j);

或者,您可以在实现排序逻辑的同一方法中进行所有交换,而无需调用另一个交换方法来移动事物。希望这会有所帮助

为了让您了解排序算法,如使用整数的 shell 排序,您将执行以下操作(不是最有效的,但可以帮助您入门)

// implement findMin and then do shellsort as below
public static void isort(int arr[]) 
    for (int i = 0; i < arr.length; i++) 
        int mIndex = findMin(arr, i, arr.length);
        if (mIndex != i) 
            int temp = arr[mIndex];
            arr[mIndex] = arr[i];
            arr[i] = temp;
        
    

修改您的逻辑以在您的案例中使用基于学生平均分数的比较。您还应该在 *** 上搜索以了解排序算法。希望这会有所帮助

【讨论】:

【参考方案3】:

鉴于 House 类具有以下信息:-

Attributes:
houseType – char
price – double
area – double
owner – Person

Methods:
calculateTax()
toString()
Person class

Attributes:
name – String
ic – String
gender - char
government – boolean

Methods:
fromKelantan()
gender()
    为这两个类编写一个默认构造函数和普通构造函数 为两个子类编写检索器和设置器方法 为两个子类编写处理器方法

Method calculateTax() 返还此类土地的税款,具体取决于其面积和在该土地上建造的房屋类型,如下表所示。

House Type Description Tax Rate(RM/m2)
T Terrace 10
S Semi-Detached 15
B Bungalow 20
C Condominium 30

Method toString() 返回所有信息。

Method fromKelantan() 返回真/假取决于 ic (Kelantan- 03) 下表。

Method gender() 从 ic 返回“f”或“m”。

【讨论】:

【参考方案4】:

这看起来你有一个学生数组,你想按 avgScore 排序,但你不想使用 ArrayList 或 Comprator 。如果您的排序基于 abgscore ,那么您可以使用任何做空 Ex bobble 。插入、快速或合并排序算法

【讨论】:

以上是关于如何使用以下代码根据实例变量对对象数组进行升序排序的主要内容,如果未能解决你的问题,请参考以下文章

PHP数组排序

数组对象根据 某个字段进行排序

如何对 mongoose/mongodb 和 nodejs 中的对象数组进行排序?

如何根据信号强度按升序对 getScanResults() 列表进行排序?

Python:根据升序x数组对y值数组进行排序

JQuery使用日期对对象数组进行排序[重复]