代码之家  ›  专栏  ›  技术社区  ›  user2951723

Java ArrayList字符串选择排序

  •  3
  • user2951723  · 技术社区  · 7 年前

    我正在努力对字符串的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”]

    2 回复  |  直到 7 年前
        1
  •  5
  •   Eran    7 年前

    您没有更新您的 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
  •  0
  •   Adriaan Koster    7 年前

    如前所述,您需要在列表中进行实际交换,而不仅仅是临时变量(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”。事实上,这是一个清单已经很清楚了。约定是根据集合包含的数据的含义命名集合
    • 在类上引入了泛型类型变量( <T extends Comparable> ). 这允许对任何类型的数据进行排序,只要它实现了可比较的接口