【问题标题】:Java ArrayList String Selection SortJava ArrayList 字符串选择排序
【发布时间】:2018-04-23 11:18:58
【问题描述】:

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

    ArrayList<String> list = new ArrayList<String>();
    list.add("a");
    list.add("d");
    list.add("f");
    list.add("c");
    System.out.println(list);
    int i;
    int j;
    int minValue;
    int minIndex;

    for (i=0; i<list.size(); i++) {
        System.out.println(list.get(i));
        char iLetter = (list.get(i).charAt(0));
        int iValue = (int) iLetter;
        minValue = iValue;
        minIndex = i;
        for(j=i; j<list.size(); j++) {
            char jLetter = list.get(j).charAt(0);
            int jValue = (int) jLetter;
            if (jValue < minValue) {
                minValue = jValue;
                minIndex = j;
            }
        }
        if(minValue < iValue) {
            int temp = iValue;
            char idx = list.get(minIndex).charAt(0);
            int idxValue = (int) idx;
            iValue = idxValue;
            idxValue = temp;

        }
    }
    System.out.println(list);
}

它仍然将其打印为 ["a", "d", "f", "c"]

【问题讨论】:

  • 你在哪里交换元素在列表中的位置?
  • 你想做什么?在您的整个“排序”算法中,您根本不会更改列表,而只是复制一堆原始值。总的来说,无论你在做什么,当你可以调用 Collections.sort(list) 并完成它时,尝试对一个简单的字符串列表进行排序都是一种很棒的方式
  • 你需要交换元素
  • 列表是否总是包含单字符字符串?
  • 如何调换职位?

标签: java arraylist selection-sort


【解决方案1】:

您没有在循环中的任何位置更新您的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]

【讨论】:

    【解决方案2】:

    如前所述,您需要在列表中进行实际交换,而不仅仅是临时变量(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);
    }
    

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

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

    我所做的一些更改:

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

    【讨论】:

      猜你喜欢
      • 2011-07-27
      • 2013-05-05
      • 2015-05-03
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      • 2020-04-21
      • 1970-01-01
      • 2016-03-26
      相关资源
      最近更新 更多