选择在ArrayList中没有collections.sort的情况下排序

时间:2018-01-15 16:08:48

标签: java selection-sort

所以,为什么赢得这个代码工作它总是返回原始列表(我还没有把return语句,但有人可以确定为什么我的选择排序算法背后的逻辑不起作用)。任何帮助都将很高兴!

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class ArrayListDemo {
    public static void main(String [] args) {
        ArrayList <String> list = new ArrayList <String> (15);
        list.add("Wilson");
        list.add("Annans");
        list.add("Manning");
        list.add("Branday");
        list.add("Smittens");
        list.add(2, "Goddard Fey");
        list.set((list.size()) - 1, "Brand Brandon");
        list.add("Brand Boarders");
        selectionSort(list);
    }
    static void selectionSort(ArrayList<String> a) {
         int smallindex;
         for(int i = 0; i < a.size(); i++) {
              smallindex = i; // set first element as smallest
              for(int j = i + 1; j < a.size(); j++) { // find smallest
                   if (a.get(j).compareTo(a.get(smallindex)) > 0) {
                       swap(a, i, j);
                   }

              }
         }
    }

    static void swap(ArrayList<String> a, int index1, int index2) {
         String i_string = a.get(index1);
         String j_string = a.get(index2);
         String temp = i_string;
         i_string = j_string;
         j_string = temp;
    } 
}

1 个答案:

答案 0 :(得分:1)

您的swap(ArrayList<String> a, int index1, int index2)方法会创建局部变量 - i_stringj_string - 然后交换它们。这对输入List a的内容没有影响。

要更改i List的{​​{1}}'元素的值,您必须致电a

您可以自己实施交换方法,也可以使用现有的a.set(i,newValue)

Collections.swap

如果您希望学习如何正确实现static void selectionSort(ArrayList<String> a) { int smallindex; for(int i = 0; i < a.size(); i++) { smallindex = i; // set first element as smallest for(int j = i + 1; j < a.size(); j++) { // find smallest if (a.get(j).compareTo(a.get(smallindex)) > 0) { Collections.swap(a, i, j); } } } } ,可以查看JDK实现:

swap

如您所见,此方法将public static void swap(List<?> list, int i, int j) { final List l = list; l.set(i, l.set(j, l.get(i))); } 返回的值设置为l.set(j, l.get(i))的新i'元素。 List将值l.set(j, l.get(i))设置为l.get(i)的新j'元素,并返回先前的List个元素。因此,j的新i元素成为之前的List元素。