Java中的选择性排序

时间:2014-01-05 23:08:23

标签: 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++){
        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]+" ");}
}

}

3 个答案:

答案 0 :(得分:1)

您使用交换功能。执行此操作时,您将在索引之间交换小时值。那么,那么你也应该交换相应的飞行员名字。这种方式对于每次交换,飞行员也将被交换。

我所说的交换功能是:

int temp=arr[i];
arr[i]=arr[min];
arr[min]=temp;

做类似的事情:

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

要考虑的另一件事是创建一个Pilot类。在这样做时,您将保持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);
    }

}

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

答案 1 :(得分:1)

使用TreeMap存储Pilot的飞行时间,然后Java会根据值自动对其进行排序(将其作为小时数)。

设置一个HashTree

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

然后为其添加值:

pilots.put(pilot,pilotHours);

在您的情况下,您可以使用一些看起来像这样的代码(来自给定的代码):

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);
}
   }

在调整它以适合您的代码后,告诉我它是怎么回事。

主要答案/建议是使用TreeMap

答案 2 :(得分:1)

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

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

第二个解决方案的实现看起来像这样(保留了大部分原始代码):

import java.util.ArrayList;

public class Test {
    public static void main(String[] args) {
        ArrayList<String> nameArr=new ArrayList<String>();
        nameArr.add("John");
        nameArr.add("Robert");
        nameArr.add("Duncan");
        nameArr.add("Steve");
        nameArr.add("Adrian");
        nameArr.add("Paul");
        nameArr.add("Michael");
        nameArr.add("Andrew");
        nameArr.add("Henry");
        nameArr.add("Bradley");
        int arr[]={50,150,100,250,200,24,376,541,56,164};
        int arrLength = arr.length;
        assert arrLength == nameArr.size();

        int indexArr[]=new int[arrLength];
        for(int i=0;i<arrLength;i++){
            indexArr[i]=i;
        }

        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;

                temp=indexArr[i];
                indexArr[i]=indexArr[min];
                indexArr[min]=temp;
            }
        }

        for (int j=0;j<arrLength;j++) {
            int index=indexArr[j];
            String name=nameArr.get(index);
            System.out.println(name);
        }
    }
}