如何在java中使用比较器的选择排序?

时间:2018-04-10 14:05:42

标签: java arraylist selection comparator selection-sort

这里的帮助将不胜感激。我很困惑。我要做的是我必须使用选择排序算法对arraylist进行排序,但是arraylist中的每个对象都有多个索引。这必须在java中完成。

例如:

public class a {

    private int number;
    private String letter;

    public a(int n, String l)
    {
        number = n;
        letter = l;
    }
}

public class SortingArrays {

    private ArrayList<a> myarray;

    private Comparator<a> sortByNumber;
    private Comparator<a> sortByLetter;

    public FootballPlayerData() {

        myarray = new ArrayList<a>();

        getmyarray().add(new a(2, "A"));
        getmyarray().add(new a(7, "J"));

        //COMPARATORs//
        sortByNumber = new Comparator<a>() {
            @Override
            public int compare(a o1, a o2) 
            {
                if (o1.number < (o2.number)) {
                    return -1;
                }
                if (o1.number == (o2.number)) {
                    return 0;
                }
                return 1;
            }

        };
        sortByLetter = new Comparator<a>() {
            @Override
            public int compare(a o1, a o2) 
            {
                return o1.letter.compareTo(o2.letter);
            }

         };

    public void selectionSortbyNumber
    {
        ???
    }
    public void selectionSortbyLetter
    {
        ???
    }
}

那么如何在java中创建一个选择排序(必须是选择排序),用对象中的不同元素对arraylist进行排序?我已经将比较器部分关闭,但我不知道如何将其与选择排序合并。

2 个答案:

答案 0 :(得分:0)

来自https://en.wikipedia.org/wiki/Selection_sort的来源:

/* a[0] to a[n-1] is the array to sort */
int i,j;
int n;

/* advance the position through the entire array */
/*   (could do j < n-1 because single element is also min element) */
int iMin;
for (j = 0; j < n-1; j++) {
    /* find the min element in the unsorted a[j .. n-1] */
    /* assume the min is the first element */
    iMin = j;
    /* test against elements after j to find the smallest */
    for (i = j+1; i < n; i++) {
        /* if this element is less, then it is the new minimum */
        if (a[i] < a[iMin]) {
            /* found new minimum; remember its index */
            iMin = i;
        }
    }
}

if (iMin != j) {
    swap(a[j], a[iMin]);
}

方法swap()只需切换数组中的值。

您的工作是将数组与列表交换。 :P但这并不是那么难,因为你可以通过索引get(int index)方法访问列表值。

答案 1 :(得分:0)

Comparator实现通常用于将两个元素相互比较,如果第一个元素小于第二个元素,则返回-1(或任何负数),0如果第一个元素大于第二个元素,则等于1(或任何正数)。这可用于比较两个元素,以查看一个元素是否大于,小于或等于另一个元素。

在选择排序的上下文中,您可以使用提供的比较器来确定列表的未排序部分中的哪个值是最小值。选择排序的一般算法如下:

for i from 0 to array.length:
    current_minimum_index = i
    for j from i + 1 to array.length:
        if array at j is less than array at current_minimum_index:
            current_minimum_index = j

        swap array at current_minimum_index with array at i

可以使用if array at j is less than array at current_minimum_index实施Comparator。例如,如果提供的ArrayList名为array,则对名为Comparator的{​​{1}}对象的调用将为:

comparator

我不想向您提供完整的答案,因为这不会帮助您学习选择排序,但排序的方法签名将类似于以下内容:

if (comparator.compare(array.get(j), array.get(current_minimum_index))) < 0)

您对此方法的调用将类似于以下之一:

public <T> void selectionSort(ArrayList<T> array, Comparator<T> comparator) {

    // for i from 0 to array.size():
        // currentMinIndex = i
        // for j from i + 1 to array.size():
            if (comparator.compare(array.get(j), array.get(currentMinIndex))) < 0) {
                // currentMinIndex = j
            }

            // swap array at currentMinIndex with array at i
}