将列表放入自然顺序。不行

时间:2014-11-14 23:12:44

标签: java list sorting

这可能不是一个好的实现,但我想知道为什么我的排序不起作用。我唯一能做的就是从列表中删除“文本”。也许在sort()方法中使用list并不是一个好习惯,我应该使用数组,但我想看到它可以用List来完成。

public class MyProgram {

    public static void main(String[] args) {

        // Text from TextField.
        String unorderedMixedText = "10 text 2 43 -12 0 41";

        String[] toArrray = unorderedMixedText.split(" ");

        List<Integer> numbers = new ArrayList<>();

        // To get only numbers in text.
        for(int i = 0; i < toArrray.length; ) {
           try {
              numbers.add(Integer.parseInt(toArrray[i]));
              i++;
           } catch (NumberFormatException e) {
               i++;
           }
        }
        // Unordered
        Arrays.stream(toArrray).forEach(s -> System.out.print(s + " "));

        // Empty line
        System.out.println();

        sort(numbers);

        // Ordered
        numbers.stream().forEach((number) -> System.out.print(number + " "));
    }

    private static void sort(List<Integer> list) {
        for(int i = 0; i < list.size() -1; i++) {
            for(int j = i+1; j < i; j++){
                if(list.get(i) > list.get(j)) {
                    int big = list.get(i);
                    int small = list.get(j);
                    list.set(i, small);
                    list.set(j, big);
                }
            }
        }
    }   
}

我从我的程序中得到了这个输出。

10 text 2 43 -12 0 41 
10 2 43 -12 0 41

3 个答案:

答案 0 :(得分:3)

你的循环中存在问题:

        for(int j = i+1; j < i; j++){
            if(list.get(i) > list.get(j)) {
                int big = list.get(i);
                int small = list.get(j);
                list.set(i, small);
                list.set(j, big);
            }

i + 1总是&gt;我所以你的循环没有工作

答案 1 :(得分:1)

作为您的方法的替代方法,您可能想知道Comparator,这是一个可用于任意比较集合(如Lists和ArrayLists)的类。例如,对于您的示例,我们可以执行以下操作:

import java.util.*;
public class Test {

  public class NaturalNumbers implements Comparator<Integer> {
    // natural comparison is strictly based on what the result
    // of "a minus b" is. So let's just do that!
    public int compare(Integer a, Integer b) {
      return a.intValue() - b.intValue();
    }
  }

  public static void main(String[] args) {
    new Test();
  }

  public Test() {
    String s = "1 cats 5432 one two 32 63 12 364 -243 13 lol";
    // turn that into a list of valid Integers:
    List<String> _terms = Arrays.asList(s.split(" "));
    ArrayList<Integer> terms = new ArrayList<Integer>();
    for(String term: _terms) {
       try {
         terms.add(Integer.parseInt(term));
       } catch (Exception e) {}
    }
    // sort that list using a natural ordering comparator:
    Collections.sort(terms, new NaturalNumbers());
    System.out.println(terms.toString());
  }
}

我们定义一个字符串列表,拆分它然后丢弃所有&#34;这些不是数字&#34;元素,然后我们在结果的整数列表上运行一个自然排序比较器。成功,生成的排序列表从-243开始,到5432结束。

事实上,我们在技术上甚至不需要比较器通过自然排序对数字进行排序,因为没有明确的比较器Collections.sort(list)无论如何都会根据自然顺序排序,但坦率地说我是假设的这是家庭作业,明天你将被要求以完全不同的方式对这个列表进行排序。现在你知道你将如何实现这一目标。

答案 2 :(得分:0)

问题是即使你告诉sort()使用该列表,它实际上也不会返回它。
1.替换

    private static void sort(List list)  

    with

    private static List sort(List list)
  1. 更改

    sort(numbers);
    
    to
    
    numbers = sort(numbers);
    
  2. 在最后添加return list;