Java中的选择性排序

Java中的选择性排序,java,Java,我必须列出飞行员的飞行小时数,并进行升序和降序排序。 我做了小时的升序选择,但我不知道如何让程序显示基于小时的名字升序 这就是我所做的。 你能帮我吗 int arr[]={50,150,100,250,200,24,376,541,56,164}; int arrLength = arr.length; for(int i=0;i<arrLength-1;i++){ int min=i; for (int k=i+1;k<arrLength;k++){

我必须列出飞行员的飞行小时数,并进行升序和降序排序。 我做了小时的升序选择,但我不知道如何让程序显示基于小时的名字升序

这就是我所做的。 你能帮我吗

int arr[]={50,150,100,250,200,24,376,541,56,164};
int arrLength = arr.length;
for(int i=0;i<arrLength-1;i++){
    int min=i;
    for (int k=i+1;k<arrLength;k++){
        if(arr[k]<arr[min]){
            min = k;
        }
    }
    if (i != min) {
        int temp=arr[i];
        arr[i]=arr[min];
        arr[min]=temp;
    }
}
for (int j=0;j<arrLength;j++) {
    System.out.println(arr[j]+" ");}
}
intarr[]={50150100252002,24376541,56164};
int arrLength=arr.length;

对于(int i=0;i您使用交换功能。当您这样做时,您将在索引之间交换小时值。然后,您还应该交换相应的导频名称。这样,对于每次交换,导频也将被交换

我所说的交换功能是:

int temp=arr[i];
arr[i]=arr[min];
arr[min]=temp;
做一些类似于:

String tempName = names[i];
names[i] = names[min];
names[min] = tempName;

另一个要考虑的事情是创建<代码>试点>代码>类。这样做,您将保持OOP概念,并且可以更容易地处理排序。

比如说,

public class Pilot implements Comparable<Pilot> {

    int hours;
    String name;

    public Pilot(String name, int hours){
        this.name = name;
        this.hours = hours;
    }

    @Override
    public int compareTo(Pilot other){
        return hours.compareTo(other.hours);
    }

}
公共类试点实现可比性{
整小时;
字符串名;
公共导频(字符串名称,整数小时){
this.name=名称;
这个.小时=小时;
}
@凌驾
公共内部比较(试点其他){
返回时间。与(其他时间)相比;
}
}

然后,您可以使用
Pilot#compareTo(Pilot)
功能来确定如何根据小时数对飞行员进行排序,甚至完全改变您希望从那里对飞行员进行排序的方式。

使用
TreeMap
存储飞行员及其飞行小时数,然后Java会根据该值自动为您排序(定为小时)

设置一个
哈希树

public static Map<String, Integer> pilots = new TreeMap<String, Integer>();
publicstaticmap-pilots=newtreemap();
然后向其添加值:

import java.util.Map;
import java.util.TreeMap;

   public class Test {

public static Map<String, Integer> pilots = new TreeMap<String, Integer>();

public static void main(String[] args) {

    int arr[] = { 50, 150, 100, 250, 200, 24, 376, 541, 56, 164 };
    int arrLength = arr.length;
    for (int i = 0; i < arrLength - 1; i++) {
        int min = i;
        for (int k = i + 1; k < arrLength; k++) {
            if (arr[k] < arr[min]) {
                min = k;
            }
        }
        if (i != min) {
            int temp = arr[i];
            arr[i] = arr[min];
            arr[min] = temp;
        }
    }
    for (int j = 0; j < arrLength; j++) {
        System.out.println(arr[j] + " ");
    }

    for (int p = 0; p < arrLength; p++) {

        int pilotHours = arr[p];
        String pilot = "PILOT NAME, HOWEVER YOU GET IT";

        pilots.put(pilot, pilotHours);

    }
    System.out.println(pilots);
}
   }
飞行员。推杆(飞行员,飞行员)

在您的情况下,您可以使用如下代码(来自给定代码):

import java.util.Map;
import java.util.TreeMap;

   public class Test {

public static Map<String, Integer> pilots = new TreeMap<String, Integer>();

public static void main(String[] args) {

    int arr[] = { 50, 150, 100, 250, 200, 24, 376, 541, 56, 164 };
    int arrLength = arr.length;
    for (int i = 0; i < arrLength - 1; i++) {
        int min = i;
        for (int k = i + 1; k < arrLength; k++) {
            if (arr[k] < arr[min]) {
                min = k;
            }
        }
        if (i != min) {
            int temp = arr[i];
            arr[i] = arr[min];
            arr[min] = temp;
        }
    }
    for (int j = 0; j < arrLength; j++) {
        System.out.println(arr[j] + " ");
    }

    for (int p = 0; p < arrLength; p++) {

        int pilotHours = arr[p];
        String pilot = "PILOT NAME, HOWEVER YOU GET IT";

        pilots.put(pilot, pilotHours);

    }
    System.out.println(pilots);
}
   }
import java.util.Map;
导入java.util.TreeMap;
公开课考试{
publicstaticmap-pilots=newtreemap();
公共静态void main(字符串[]args){
int arr[]={50150100250200,24376541,56164};
int arrLength=arr.length;
对于(int i=0;i
在调整它以适应您的代码之后,告诉我它是如何运行的


主要的答案/建议是使用
TreeMap

将飞行员的姓名与相应的小时数配对。对该数组进行排序(姓名,小时)配对仅使用小时数作为选择排序的排序标准。然后遍历已排序的配对数组并仅显示导频的名称,它们将按预期顺序排列

一个相关的解决方案是使用(索引,小时)对,其中索引指的是原始的导频名称数组。当遍历已排序的对数组时,可以使用此索引在原始数组中引用匹配的导频名称。这种方法避免了在输入或内存使用受到限制的情况下复制对数组中的导频名称数组

第二个解决方案的实现如下所示(保留大部分原始代码):

import java.util.ArrayList;
公开课考试{
公共静态void main(字符串[]args){
ArrayList nameArr=新的ArrayList();
姓名添加(“约翰”);
姓名附录(“罗伯特”);
名称添加(“邓肯”);
姓名添加(“史蒂夫”);
名称添加(“阿德里安”);
姓名添加(“保罗”);
姓名添加(“迈克尔”);
名称添加(“安德鲁”);
姓名附录(“亨利”);
姓名附录(“布拉德利”);
int arr[]={5015010025200,24376541,56164};
int arrLength=arr.length;
断言arrLength==nameArr.size();
int indexArr[]=新的int[arrLength];

对于(int i=0;我这里有引航员?@Obicere,我的错,我指的是一个TreeMapIf,如果我编译了你的代码,它仍然会对我的数字进行排序。我把引航员的名字放在哪里?很抱歉我是这样一个n00b,但这是我在上了几节课之后在java中的第一个家庭作业所以…@user3163682,如果我理解正确的话,在我的代码中,它说,
String pilot=“PILOT NAME,不管你如何获得它”
这是一个简单字符串形式的PILOT NAME,但是如果你有一个带有PILOT NAME的数组,那么你可以简单地将
string PILOT=“PILOT NAME,不管你如何获得它”
放入for循环,并将PILOT=设置为
pilotArray[p]
那么它应该可以工作。我构建了另一个带有引导名的ArrayList的文件,但我仍然无法链接它们。如果它是
ArrayList
,则使用:String pilot=pilotArrayList.get(p).toString();我理解你说的话,但我不知道怎么做。我是Java新手,几周前就开始了。你能为我编译这段代码吗?@user3163682我编辑了答案,添加了第二个解决方案的示例实现。