繁体   English   中英

对字符串进行排序并解析为列表

[英]Sort String and parse to list

我有一个包含名称和评级的字符串,我想根据评级以从高到低的方式对它们进行排序。 评级将始终为正数。

字符串如下所示:

"john;q=1, david;q=0, scott, robert, bob;q=0.5"

如果名称没有值,则它应该在排序顺序中排在最后。 我还想将此字符串拆分为一个列表。 所以上面的字符串应该被解析成:

["john", "bob", "david", "scott", "robert"]

注意:“scott”和“robert”的顺序应该和原始字符串中出现的一样

这就是我目前的做法:

private List<String> parseString(final String str) {
    Map<String, List<String>> map = new TreeMap<>(Collections.reverseOrder());
    String[] acceptHeaders = str.replace(" ", "").split(",");

    for (String header : acceptHeaders) {
        if (header.contains(";")) {
            int equalIndex = header.indexOf("=");
            String value = header.substring(equalIndex + 1, header.length());
            String name = header.substring(0, equalIndex-2);
            if (map.containsKey(value)) {
                List<String> val = map.get(value);
                val.add(name);
                map.put(value, val);
            } else {
                List<String> val = new ArrayList<>();
                val.add(name);
                map.put(value, val);
            }
        } else {
            if (!map.containsKey("-1")) {
                map.put("-1", new ArrayList<>());
            }
            List<String> val = map.get("-1");
            val.add(header);
            map.put("-1", val);
        }
    }

    return map.values().stream().flatMap(List::stream).collect(Collectors.toList());;
}

在 java 中有更好/更清洁的方法吗?

public class Comparator {

public static class NewClass implements  Comparable<NewClass>{
    public String s;
    public float rating;

    public NewClass(String s) {
        String[] split = s.split(";q=");
        this.s = split[0];
        if(split.length > 1){
            this.rating = Float.parseFloat(split[1]);
        }else{
            this.rating = -1f;
        }
    }
    @Override
    public int compareTo(NewClass o) {
        return Float.compare(o.rating, this.rating); //sorting in descending order
    }
}

public static void main(String[] args) {
    String[] input = new String[]{"john;q=1", "david;q=0", "scott", "robert", "bob;q=0.5"};
    ArrayList<NewClass> items = new ArrayList<>();
    for(String s : input){
        items.add(new NewClass(s));
    }
    Collections.sort(items);
    String[] output = new String[input.length];
    int count= 0;
    for(NewClass item : items){
        output[count++] = item.s;
    }
    System.out.println(Arrays.toString(output));
}

我创建了一个新的 class 并使用 Comparable Interface 使用评级对项目进行排序。 如果没有给出评级,我认为它是-1。 你可以在这里有任何价值。

  1. 将所有字符串插入 ArrarList

  2. 使用 Collections.sort() 或 Java 中的等效项对 ArrayList 进行排序 8. 在 sort() 方法和 compare() 方法中传递一个比较器,并相应地返回该比较器的评级。

我不确定这是否会更清洁,但我想到了这种方法。

  1. 创建一个名为 Client/Student 的 Class。
  2. 解析字符串并创建客户/学生 object 并将然后放入列表ArrayList<DevStudent> devList
  3. 然后使用Collections.sort()对它们进行排序

开发学生 class:

class DevStudent{
    String name;
    double rating;
    
    public DevStudent(String name,double rating){
        this.name = name;
        this.rating = rating;
    }   
}

使用 Collections.sort 排序:

List<DevStudent> devList = new ArrayList<DevStudent>();
//populate devList
//then sort
Collections.sort(devList, new Comparator<DevStudent>() {
   @Override
   public int compare(DevStudent c1, DevStudent c2) {
      return Double.compare(c2.rating, c1.rating);
    }
});

看到这个:

    TreeMap<Float, String> map = new TreeMap<>(Collections.reverseOrder());
    for (String user : input.split(", ")) {
        String[] split = user.split(";q=");
        map.put(split.length == 1 ? (map.lastKey() - 1f) : Float.valueOf(split[1]), split[0]);
    }
    return map.values();

还有比这更好的解决方案吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM