如何使用字符串,数字和空字符串对列表进行排序?

时间:2018-08-03 14:59:33

标签: java arrays sorting collections android-recyclerview

上下文:

我有一个要排序的楼层列表,以显示在android的回收器视图中:

现有楼层的示例:

+ 1º
+ 2º
R/C
R/C
"" -> Empty string because there is no information about it

目标:     我需要以 desc asc 的方式对地板进行排序。

代码:     这是我的代码,问题是像上面看到的那样,在楼层上有字母和空字符串,并且我无法在字母和空字符串中执行Integer.parseInt(给出NumberFormatException)。我正在执行此转换,因为我认为我需要按顺序将变量传递给Int。我想我不能这样做,因为地板上可能包含字母,就像您在示例中看到的那样。

Collections.sort(listUAs, new Comparator<ModelUA>() {
                        @Override
                        public int compare(ModelUA lhs, ModelUA rhs) {
                            // -1 - less than, 1 - greater than, 0 - equal, all inversed for descending
                                int floorLhs = Integer.parseInt(lhs.getFloor().replaceAll("[^\\d]", ""));
                                int floorIntRhs = Integer.parseInt(rhs.getFloor().replaceAll("[^\\d]", ""));
                                return Integer.compare(floorIntRhs, floorLhs);
                        }
                    });

有人可以为您提供更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

只需按字典顺序比较字符串即可。除非您的案件更为复杂,否则通常就足够了。

这很冗长,但是应该演示该怎么做。其中大部分只是为了举例说明。向下滚动到呼叫models.sort,以获取所需内容。

package mandelbrot_redo.seesaw_main;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class ModelUA {
    private String floor;

    public ModelUA(String floor) {
        this.floor = floor;
    }

    public String getFloor() {
        return this.floor;
    }

    public static void main(String[] args) {
        // Unsorted floor strings
        List<String> floorStrs =
                Arrays.asList("R/C",
                              "+ 1º",
                              "R/C",
                              "+ 2º",
                              "");

        // Wrap each floor string in a ModelUA
        List<ModelUA> models = floorStrs.stream().map(ModelUA::new).collect(Collectors.toList());

        models.sort(new Comparator<ModelUA>() {
            @Override
            public int compare(ModelUA m1, ModelUA m2) {
                // Just delegate to the string compare method
                return m1.getFloor().compareTo(m2.getFloor());
            }
        });

        for (ModelUA m : models) {
            System.out.println(m.getFloor());
        }
    }
}

此打印:

+ 1º
+ 2º
R/C
R/C

要颠倒排序顺序,您只需在compareTo行中交换模型:

m2.getFloor().compareTo(m1.getFloor());