gpt4 book ai didi

java - 按自定义顺序按字段对对象的 ArrayList 进行排序

转载 作者:行者123 更新时间:2023-11-30 06:10:05 24 4
gpt4 key购买 nike

如何实现对字段名内容的自定义排序:

  • 第一个元素:P 后跟数字 [1-9]{2} 总是在前面
  • 后跟:P 后跟数字 0[0-9]
  • 其次是:S
  • 后跟数字 [1-9]{2}
  • 然后按正常顺序剩下的 i1.getName().compareToIgnoreCase(i2.getName())

    private static Comparator<Item> itemComperator = new Comparator<Item>() {
    @Override
    public int compare(Item i1, Item i2) {
    if (i1.getName().matches("P[1-9]{2}") && i2.getName().matches("P0[0-9]"))
    return -1;
    else if (i1.getName().matches("S[1-9]{2}"))
    return -1;
    else
    return i1.getName().compareToIgnoreCase(i2.getName());
    }
    };

    @Test
    public void sortItem() {
    Item item01 = new Item(1, "R59");
    Item item02 = new Item(2, "S48");
    Item item03 = new Item(3, "P01");
    Item item04 = new Item(4, "P25");
    Item item05 = new Item(5, "R99");

    List<Item> items = Arrays.asList(item01, item02, item03, item04, item05);
    System.out.println("before sorting");
    long seed = System.nanoTime();
    Collections.shuffle(items, new Random(seed));
    for (Item i : items) {
    System.out.println(i.getId() + " " + i.getName());
    }

    System.out.println("after sorting");
    Collections.sort(items, itemComperator);
    for (Item i : items) {
    System.out.println(i.getId() + " " + i.getName());
    }


    }

    public class Item {
    private int id;
    private String name;

    public Item(int id, String name) {
    this.id = id;
    this.name = name;
    }

    public int getId() {
    return id;
    }

    public void setId(int id) {
    this.id = id;
    }

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }
    }

预期输出:

after sorting
4 P25
3 P01
2 S48
1 R59
5 R99

最佳答案

我想我会首先将每个输入映射到一个“种类”数字,该数字基于上面的标准列表。例如:

int kind(String input) {
if (input.matches("P[1-9]{2}") {
return 0;
} else if (input.matches("P0[0-9]")) {
return 1;
} else if (input.matches("S.*")) {
return 2;
} else if (input.matches("[1-9]{2}")) {
return 3;
} else {
return 4;
}
}

这为您提供了一种查看两个字符串是否属于同一“种类”的方法;如果不是,则返回基于种类的排序。如果它们是同类,只需使用(不区分大小写)字典顺序比较它们(您没有指定,但我假设您希望例如“P11”出现在“P22”之前):

public int compare(Item a, Item b) {
String nameA = a.getName();
String nameB = b.getName();

int kindA = kind(nameA);
int kindB = kind(nameB);
if (kindA != kindB) {
return Integer.compare(kindA, kindB);
} else {
return nameA.compareToIgnoreCase(nameB);
}
}

关于java - 按自定义顺序按字段对对象的 ArrayList 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36495048/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com