以下是我的列表,其中始终采用aXXXX
-
List<String> child = Arrays.asList("a5", "a10", "a2", "a1", "a40");
System.out.println(child);
我的child
列表将始终包含aXXXX
现在我需要对上面的列表进行排序并从中提取最大的字符串..
所以在上面的例子中,它将是a40
。我最初想要使用Collections.sort(child);
,但它没有按正确的升序排序。
答案 0 :(得分:0)
可以进行排序,但您必须在开头提取“a”并将其余部分视为整数,以防止字符串"2"
大于字符串"10"
。尝试Comparator
执行此操作,或创建仅包含提取的整数的新列表。
答案 1 :(得分:0)
你快到了。可能的解决方案是编写自己的比较器:
Collections.sort(child,new Comparator<String>() {
@Override
public int compare(String lhs, String rhs) {
\\compare 2 values
return result;
}
});
http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html
可能返回的值:
-1 : lhs < rhs
0 : lhs == rhs
+1 : lhs > rhs
答案 2 :(得分:0)
您可以使用定义分类策略的比较器: 另请参阅http://docs.oracle.com/javase/tutorial/collections/interfaces/order.html
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Main {
static final Comparator<String> aStringComparator = new Comparator<String>() {
public int compare(String s1, String s2) {
//assumed input are strings in the form axxxx
int numfromS1 = Integer.valueOf(s1.subSequence(1, s1.length()).toString());
int numfromS2 = Integer.valueOf(s2.subSequence(1, s2.length()).toString());
return numfromS1 - numfromS2;
}
};
public static void main(String[] args) {
List<String> child = Arrays.asList("a5", "a10", "a2", "a1", "a40");
Collections.sort(child, aStringComparator);
System.out.println(child);
}
}
答案 3 :(得分:0)
其他人已经展示了如何使用Java 7做到这一点。
这也可以使用Java 8完成以下操作:
List<String> child = Arrays.asList("a5", "a10", "a2", "a1", "a40");
String result = child.stream()
.sorted(
Collections.reverseOrder(
Comparator.comparing(
c -> Integer.parseInt(c.substring(1, c.length()))
)
)
)
.findFirst().get();
System.out.println(result);
这是做什么的:
Stream<String>
获取child
。Comparator<String>
,它基于lambda c -> Integer.parseInt(c.substring(1, c.length()))
进行比较,后者将第二个字符的文本解析为字符串。Optional<String>
从findFirst()
返回的get()
中取出它。 Comparator
可以通过将.reversed()
附加到Collections.reverseOrder()
而不是将其包裹在{{1}}中来更好地编写,但我不确定它现在是如何工作的。