[英]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。 你可以在这里有任何价值。
将所有字符串插入 ArrarList
使用 Collections.sort() 或 Java 中的等效项对 ArrayList 进行排序 8. 在 sort() 方法和 compare() 方法中传递一个比较器,并相应地返回该比较器的评级。
我不确定这是否会更清洁,但我想到了这种方法。
ArrayList<DevStudent> devList
。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.