Java ArrayList字符串选择排序

时间:2017-11-10 09:11:11

标签: java arraylist selection-sort

我正在努力在字符串的ArrayList上进行选择排序以按字母顺序排列它们。我不知道我做错了什么。但它对我来说不合适。这是我的代码。

<body>
    <%= ListView1.DataReBind()%>

它仍会将其打印为[&#34; a&#34;,&#34; d&#34;,&#34; f&#34;,&#34; c&#34;]

2 个答案:

答案 0 :(得分:5)

您没有在循环中的任何位置更新list,因此它仍未排除。

为了实际交换列表中的元素,请替换:

if(minValue < iValue) {
    int temp = iValue;
    char idx = list.get(minIndex).charAt(0);
    int idxValue = (int) idx;
    iValue = idxValue;
    idxValue = temp;
}

使用:

if(minValue < iValue) {
    Collections.swap (list, i, minIndex);
}

Collections.swap执行以下修改:

list.set(i, list.set(minIndex, list.get(i)));

现在输出

[a, c, d, f]

答案 1 :(得分:0)

如上所述,您需要在列表中进行实际交换,而不仅仅是临时变量(doh!)。

public static void main(String[] args) {

    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("d");
    list.add("f");
    list.add("c");

    System.out.println(list);

    for (int i = 0; i < list.size(); i++) {
        String smallest = list.get(i);
        int smallestIndex = i;
        for (int j = i; j < list.size(); j++) {
            String value = list.get(j);
            if (value.compareTo(smallest) < 0) {
                smallest = value;
                smallestIndex = j;
            }
        }

        if (smallestIndex != i) {
            String head = list.get(i);
            list.set(i, smallest);
            list.set(smallestIndex, head);
        }
    }

    System.out.println(list);
}

此外,您的代码只是一种方法,AKA意大利面条代码。为了使其更加面向对象,您可以进行以下更改。

import java.util.*;

public class SelectionSort<T extends Comparable> {

    private List<T> values;

    public SelectionSort(List<T> values) {
        this.values = values;
    }

    private void sort() {
        for (int headIndex = 0; headIndex < values.size(); headIndex++) {
            sortFrom(headIndex);
        }
    }

    private void sortFrom(int headIndex) {
        int smallestIndex = findSmallestFrom(headIndex);
        if (smallestIndex != headIndex) {
            swap(headIndex, smallestIndex);
        }
    }

    private int findSmallestFrom(int i) {
        int smallestIndex = i;
        T smallest = values.get(i);
        for (int j = i; j < values.size(); j++) {
            T value = values.get(j);
            if (value.compareTo(smallest) < 0) {
                smallest = value;
                smallestIndex = j;
            }
        }
        return smallestIndex;
    }

    private void swap(int i, int j) {
        T head = values.get(i);
        values.set(i, values.get(j));
        values.set(j, head);
    }

    public static void main(String[] args) {

        List<String> values = createTestData();
        System.out.println(values);

        SelectionSort selectionSort = new SelectionSort<>(values);
        selectionSort.sort();

        System.out.println(values);
    }

    private static List<String> createTestData() {
        List<String> values = new ArrayList<>();
        values.add("a");
        values.add("d");
        values.add("f");
        values.add("c");
        return values;
    }
}

我做了一些改变:

  • 创建测试数据的单独方法
  • 用于打印列表的前后状态并调用sort
  • 的单独方法
  • 创建实例而不是仅创建静态代码
  • 将迭代和逻辑分离成有意义的方法
  • 将'list'变量重命名为'values'。这是一个列表的事实已经很清楚了。惯例是根据其包含的数据的含义命名集合
  • 在类(<T extends Comparable>)上引入了泛型变量。这允许对任何类型的数据进行排序,只要它实现Comparable接口
  • 即可