排序包含字符串和整数的数组列表

问题描述 投票:1回答:6

如果我有以下ArrayList

["a 100", "b 32", "t 54", "u 1"](数组和字母在数组列表的每个单元格中用空格分隔)。

如何通过数字对数字进行排序,并将每个数字与相应的字母保持一致?

java sorting arraylist
6个回答
1
投票

您可以像在常规数组中一样使用交换方法。唯一的区别是我们使用set(index, "value")方法更新指定索引处的特定字符串。

public static void sort (ArrayList<String> arr){    

    int N = arr.size();
    int E = N-1;
    String temp;
    boolean flag = true;

    while(flag){
        flag=false;

        for(int a = 0 ; a < E ; a++){
            if(Integer.parseInt(arr.get(a).substring(arr.get(a).indexOf(" ")+1)) > 
               Integer.parseInt(arr.get(a+1).substring(arr.get(a+1).indexOf(" ")+1))) {

                temp=arr.get(a);
                arr.set(a, arr.get(a+1));   
                arr.set(a+1, temp);

                flag=true;
            }   
        }
        E--;    
    }}

排序算法是冒泡排序。由于简单,我使用过它。如果需要,您可以使用任何其他排序算法。

然后,您可以在main方法中调用sort()函数:

    public static void main(String[] args) {

    ArrayList<String> arr = new ArrayList<String>();

    arr.add("a 98");
    arr.add("a 23");
    arr.add("c 11");

    sort(arr);
}

3
投票

这看起来像是在尝试使用字符串实现面向对象的编程。幸运的是,Java已经做到了这一点。

所以,做这样的事情:

public class MyClass implements Comparable<MyClass> {
    private final String aString; //could be char perhaps..
    private final Integer anInteger;

    public MyClass(final String aString, final Integer anInteger) {
        this.aString = aString;
        this.anInteger = anInteger;
    }

    public String getAString() { return aString; }
    public Integer getAnInteger() { return anInteger; }

    public String toString() { return anInteger + " " + aString }

    //comparison by number
    public int compareTo(final MyClass other) {
        return anInteger.compareTo(other.anInteger);
    }
}

然后,你像这样使用它:

final List<MyClass> myClasses = new ArrayList<>();
myClasses.add(new MyClass("a", 100));
myClasses.add(new MyClass("b", 32));
myClasses.add(new MyClass("t", 54));
myClasses.add(new MyClass("u", 1));

Collections.sort(myClasses);

1
投票

使用自定义比较器对列表进行排序。

List<String> yourList = Arrays.asList("a 100", "b 32", "t 54", "u 1");
yourList.sort((entry1, entry2) -> {
    int number1 = Integer.parseInt(entry1.split(" ")[1]);
    int number2 = Integer.parseInt(entry2.split(" ")[1]);

    return Integer.compare(number1, number2);
});

问候


1
投票
import static java.lang.Integer.*;

只需导入静态Integer方法,您将获得最紧凑的Comparator<String>为您的目的。

(a, b) -> compare(valueOf(a.split(" ")[1]), valueOf(b.split(" ")[1]));

1
投票

假设列表中的元素是相同的模式:

那么你可以做到

public static void main(String[] args) {
    //  ["a 100", "b 32", "t 54", "u 1"]
    List<String> myList = new ArrayList<>();
    myList.add("a 100");
    myList.add("b 32");
    myList.add("t 54");
    myList.add("u 1");
    System.out.println("List unsorted" + myList);
    Collections.sort(myList, new Comparator<String>() {

        @Override
        public int compare(String o1, String o2) {
            try {
                int a1 = Integer.parseInt(o1.substring(2));
                int a2 = Integer.parseInt(o2.substring(2));
                return Integer.compare(a1,a2);
            } catch (NumberFormatException ex) {
                return 0;
            }
        }
    });
    System.out.println("List sorted" + myList);
}

0
投票

在Java 8中,Comparator有一些staticdefault方法,可以轻松创建自定义比较器。例如,您可以创建一个拆分每个字符串并将第二个字转换为整数的字符串。

list.sort(Comparator.comparingInt(
    s -> Integer.parseInt(s.split(" ")[1])
));
© www.soinside.com 2019 - 2024. All rights reserved.