需要通过字符串的一部分字符串进行排序
说我有一个字符串数组:需要通过字符串的一部分字符串进行排序
String[] array = {
"2183417234 somerandomtexthere",
"1234123656 somemorerandomtexthere",
"1093241066 andevenmore",
"1243981234 you get what i mean",
//etc
};
将如何使用长(这是一个漫长)在字符串的开始我有点这个数组,所以它“会成为看起来是这样的:
String[] array = {
"1093241066 andevenmore",
"1234123656 somemorerandomtexthere",
"1243981234 you get what i mean",
"2183417234 somerandomtexthere",
//etc
};
我试着从使它成为一个ArrayList和使用集合#排序,以创建我自己的比较,使用一个有序图/树状图everyting,我只是不能想办法。 谢谢。
使用此功能:
static long comparedValue(String s) {
return Long.valueOf(s.substring(0, s.indexOf(' ')));
}
,然后定义在它的一个方面比较:
public int compare(String left, String right) {
return comparedValue(left) - comparedValue(right);
}
如果没有在那里投射,这将无法正常工作。此外,如果发生溢出,则通过减去“long”值进行比较可能会导致错误的结果。 – 2012-07-31 22:41:10
使用Google Guava:
List<String> unsorted = Arrays.asList(array);
Function<String, Long> longFunction = new Function<String, Long>() {
@Override public Long apply(String input) {
return Long.valueOf(input.split(" ")[0]);
}
};
List<String> sorted = Ordering.natural().onResultOf(longFunction).immutableSortedCopy(unsorted);
或者,如果你不想使用列表(你应该总是喜欢集合到阵列):
Arrays.sort(array, Ordering.natural().onResultOf(longFunction));
您显示的输入工作得很好。但那是因为他们都有相同的数字位数。
public static void main(String[] args) {
String[] array = { "2183417234 somerandomtexthere",
"1234123656 somemorerandomtexthere", "1093241066 andevenmore",
"1243981234 you get what i mean", "999 little shorter"
// etc
};
List<String> list = Arrays.asList(array);
Collections.sort(list);
System.out.println(list);
}
问题开始出现时,当你使用一些短号码 - 如上图所示999 ...
输出将是:
[1093241066 andevenmore, 1234123656 somemorerandomtexthere, 1243981234 you get what i mean, 2183417234 somerandomtexthere, 999 little shorter]
所以,使其工作永诺 - 你需要你的自定义比较器,它将能够分割给定的字符串,然后将数字部分从它们中分离出来并进行比较。使用@Marko Topolik解决方案:
static long comparedValue(String s) {
return Long.valueOf(s.substring(0, s.indexOf(' ')));
}
public int compare(String left, String right) {
long result = comparedValue(left) - comparedValue(right);
boolean numberPartAreEqual = result == 0;
if (numberPartAreEqual) {
result = left.compareTo(right);
}
return (int) result;
}
自定义比较应该很好地工作:
public class LongPrefixComparator implements Comparator<String> {
@Override
public int compare(String s1, String s2) {
final long pref1 = getPrefixValue(s1);
final long pref2 = getPrefixValue(s2);
return s1 == s2 ? 0 : s1 < s2 ? -1 : 1;
}
private static long getPrefixValue(String stg) {
int len = stg.indexOf(' ');
if (len > 0) {
try {
return Long.parseLong(stg.substring(0, len));
catch (NumberFormatException ignored) {}
}
return 0L;
}
}
安置自己的比较,以便我们能够解决它 – dantuch 2012-07-31 21:32:52
你绝对应该使用自定义比较。 – 2012-07-31 21:33:07
里面的比较器可能会拆分字符串,只是比较长的值 – kosa 2012-07-31 21:33:17