【问题标题】:How to use selection sort with comparator in java?如何在java中使用选择排序和比较器?
【发布时间】:2018-09-20 04:45:18
【问题描述】:

这里的帮助将不胜感激。我很困。我要做的是我必须使用选择排序算法对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 中创建一个选择排序(必须是选择排序),按对象中的不同元素对数组列表进行排序?我已经有比较器部分了,但我不知道如何将它与选择排序结合起来。

【问题讨论】:

  • 网上找了一个选择排序算法,用Java实现。
  • Collections.sort 在幕后利用 Arrays.sort,它使用 TimSort(而不是选择排序)。如果您需要特定的算法,您可能必须自己实现它。
  • @Mena 我已经使用了 collections.sort,但是对于这个作业,很遗憾我只能使用选择排序。
  • @coder5777 你需要使用Comparator吗?使用Comparator 进行选择排序可能会很困难,因为选择排序的范围比两个值之间的比较更广泛(由Comparator 执行)。
  • @JustinAlbano,使用 Comparator 实现任何排序算法绝对没有问题。

标签: java arraylist selection comparator selection-sort


【解决方案1】:

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

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

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 来实现。例如,给定一个提供的名为arrayArrayList,对名为comparatorComparator 对象的调用将是:

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
}

您对该方法的调用将如下所示:

selectionSort(myarray, sortByNumber);
selectionSort(myarray, sortByLetter);

【讨论】:

  • 谢谢!但我有个问题。使用它时,我是否仍然需要我原来的比较器方法,或者我不需要它们,因为比较器将完全实现到选择排序中?
  • 您仍然使用您的Comparator 对象:您将它们传递给selectionSort 方法。这些Comparator 实现中的逻辑确定在选择排序期间一个值是否小于另一个值。
  • 谢谢!我想到了。这正是我所需要的:)
  • @coder5777:不客气。如果此答案或任何答案解决了您的问题,请单击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。
【解决方案2】:

来源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) 方法访问列表值。

【讨论】:

    猜你喜欢
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多