java - 根据优先级重新排列数组

标签 java arrays sorting

Person 类的对象有:M1,M2,M3,M4,M5,W1,W2,W3,W4,C1,C2。其中 M:男人,W:女人,C: child

它们存储在下面的数组中:

Person[] arr = {M1,M3,C1,W1,W3,M2,M4,W2,C2,W4,M5};

现在必须根据为每种类型的对象设置的优先级重新排列数组。优先级在枚举中给出:

enum Priority{
    One,
    Two,
    Three;
}

还要确保顺序保持不变,例如:M1 应该在 M2 之前,M2 应该在 M3 之前等等......

输入: Person[] arr = {M1,M3,C1,W1,W3,M2,M4,W2,C2,W4,M5}; 和男人的优先权:Priority.Two 女性优先:Priority.One child 的优先级:Priority.Three

预期输出: Person[] arr = {W1,W2,W3,W4,M1,M2,M3,M4,M5,C1,C2};

不正确的输出: Person[] arr = {W1,W3,W2,W4,M1,M5,M4,M3,M2,C2,C1};

后者是错误的,因为顺序也必须保持不变。

最佳答案

试试下面

    final List<Person> persons = new ArrayList<>();
    IntStream.rangeClosed(1, 5).mapToObj(i -> new Person("M" + i, Priority.TWO)).forEach(persons::add);
    IntStream.rangeClosed(1, 4).mapToObj(i -> new Person("W" + i, Priority.ONE)).forEach(persons::add);
    IntStream.rangeClosed(1, 2).mapToObj(i -> new Person("C" + i, Priority.THREE)).forEach(persons::add);
    persons.add(new Person("M11", Priority.TWO)); // test to sort by number
    List<Person> sorted = persons.stream()
            .sorted(Comparator.comparing(Person::getPriority).thenComparingInt(p -> Integer.parseInt(p.getName().substring(1))))
            .collect(Collectors.toList());
    System.out.println("Before sort " + persons.stream().map(Person::getName).collect(Collectors.toList()));
    System.out.println("After sort " + sorted.stream().map(Person::getName).collect(Collectors.toList()));

输出

Before sort [M1, M2, M3, M4, M5, W1, W2, W3, W4, C1, C2, M11]
After sort [W1, W2, W3, W4, M1, M2, M3, M4, M5, M11, C1, C2]

请注意:枚举中的值是有序的,上面的代码取决于枚举类中值的顺序

编辑-1

比较器

    Comparator<Person> comp = new Comparator<Person>() {
        @Override
        public int compare(Person p1, Person p2) {
            int co = p1.getPriority().compareTo(p2.getPriority());
            if (co == 0)
                return Integer.parseInt(p1.getName().substring(1)) - Integer.parseInt(p2.getName().substring(1));
            return co;
        }
    };

关于java - 根据优先级重新排列数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39578015/

相关文章:

java.lang.UnsatisfiedLinkError : The specified module could not be found 错误

java - 出现异常时到底会发生什么

c - 将 int 数组整合到 char 数组中

algorithm - 有人可以解释为什么这些运行时间适合这个吗?

java - Quarkus 使用 -Dnative-image.docker-build=true 构建 native 可执行文件 NoSuchFileException

java - 是否可以将 Process stdout InputStream 读取到 NIO ByteBuffer 中?

javascript - 在 Javascript 中的嵌套对象数组中查找目标对象的路径

java - 开关内的数组

javascript - 在javascript中对多维数组进行排序

string - 如何为特定字符串对文本文件进行排序?