如何在Java中按其元素大小对ArrayList进行排序?

3

我有一个包含以下字符串元素的 List<String> L1 = new ArrayList<>():

  • l, l, u, u.
  • r, u, d, l, d, l, u.
  • l, u, d, r, r, r, r, r, u, d.
  • l, u.
  • l, u, r.

我该如何通过元素大小对此列表进行排序,使得最终状态 L1 应该如下所示:

  • l, u.
  • l, u, r.
  • l, l, u, u.
  • r, u, d, l, d, l, u.
  • l, u, d, r, r, r, r, r, u, d.

我尝试使用 Collections.sort,但这会按字母表顺序进行排序,显然这不是我想要的。

3个回答

8
我认为你需要的是 Collections.sort(java.util.List, java.util.Comparator)。使用它,你可以指定一个自定义的Comparator,按照长度而不是字母顺序来比较字符串。

像这样:

List<String> stringList = new ArrayList<String>();

// Fill the list

Comparator<String> stringLengthComparator = new Comparator<String>()
    {
        @Override
        public int compare(String o1, String o2)
        {
            return Integer.compare(o1.length(), o2.length());
        }
    };

Collections.sort(stringList, stringLengthComparator);

不要自己编写整数比较函数,直接使用 Integer.compareTo(o1.length(), o2.length()) - Parker
你的意思是 Integer.compare() - shmosel

5
假设Java 8可用,且列表类型为List<String>:
list.sort(Comparator.comparing(String::length));

这将创建一个新的Comparator,它使用字符串的长度作为排序基础,然后按照其进行排序。 列表按短到长排序,但如果不希望这样...

list.sort(Comparator.comparing(String::length).reversed());

...将其反转以首先按最长字符串排序。

如果列表实际上是一个嵌套列表(问题描述有点不清晰),则应使用 List::size 而不是 String::length


让我来澄清一下,因为我以前从未使用过比较器。所以,为了对我的L1列表进行排序,按照我之前说的,在元素大小之后,我所要做的就是这样:L1.sort(Comparator.comparing(String::length));? - miTzuliK
是的,再次假设您正在使用Java 8并且正在对“String”实例进行排序。 - BambooleanLogic
我不喜欢重启一个旧的线程,但是可以使用comparable和compareTo来完成这个任务吗? - blueGOLD
使用Comparator.comparingInt比使用Comparator.comparing更为合适。 - Marc

0

您可以使用任何排序技术(冒泡、插入等)来对Arraylist的元素进行排序。在这里,我使用冒泡排序来对Arraylist的元素进行排序。

public class SortArray
{
    public static void main(String[] args)
    {   
        List<String> al = new ArrayList<String>();
        //add items to arraylist objects.
        al.add("l,l,u,u");
        al.add("r, u, d, l, d, l, u");
        al.add("l, u, d, r, r, r, r, r, u, d");
        al.add("l,u");
        al.add("l,u,r");

        //Use bubble sort here.
        for(int i=0;i<al.size();i++){
            for(int j=0;j<al.size()-i-1;j++){
                if( (al.get(j)).length() > (al.get(j+1)).length() ){
                    Collections.swap(al, j, j+1);
                }
            }
        }

        for(String str : al){
            System.out.println(str);
        }

    }
}

这真是个巧合,因为我大约半小时前就是这么做的。我现在时间很紧,所以只能用这种方式。我知道Smallhackers的解决方案是最好的(因为避免了那个O(n^2),以及冒泡排序中的两个for循环)... - miTzuliK
虽然你的回答在技术上可能是正确的,但冒泡排序几乎从来不是一个好主意,也许唯一的例外是作为一个如何不对数据进行排序的案例研究(连同 bogosort 和其他算法一起)。此外,Java 内置的排序系统对于大多数用途应该已经足够了。除非你知道自己在做什么,或者有非常具体的要求,否则实现自己的排序算法(而不是使用 Java 的或排序库的)通常不是答案。 - BambooleanLogic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接