有没有办法对包含多种数据类型的单个字符串进行排序?
例如: //包含int和words(字符串)的字符串 String str1 =“1 one 2 two t”; String str2 =“1 two 3 two t”; String str3 =“1 three 1 two t”;
假设我想通过这三个字符串中的第二个int来对它进行排序。
有没有办法告诉java搜索String的一个特定部分?
所以我想要的输出就像是:
str3
str1
str2
or
"1 three 1 two t"
"1 two 2 two t"
"1 one 3 two t"
答案 0 :(得分:1)
对单个String
进行排序是什么意思?您应该将字符串拆分为您要排序的任何分组,然后对其进行排序。如果您的数据具有特定格式,则应编写一个简短的class
,其中包含拆分到相应字段中的元素。
答案 1 :(得分:0)
在您编辑问题之前,我假设您有一个字符串列表,就像问题中定义的字符串一样。
在这种情况下,你可以用你自己的比较器做这样的事情,没有错误检查,但你看到了这个想法:
class CustomComparator implements Comparator<String> {
public int compare(String s1, String s2) {
String[] parts1 = s1.split(" ");
String[] parts2 = s2.split(" ");
Integer i1 = Integer.valueOf(parts1[2]);
Integer i2 = Integer.valueOf(parts2[2]);
return i1.compareTo(i2);
}
}
Collections.sort(Arrays.asList("3 three 4 four", "1 one 2 two", "5 five 6 six"), new CustomComparator());
答案 2 :(得分:0)
编写自己的比较器,根据需要比较字符串。像这样:
String [] values = new String [] {"foo 7 bar 3 foobar", "why 2 by 2 is 4?"};
Arrays.sort (values, new Comparator <String> ()
{
@Override
public int compare (String o1, String o2)
{
return extract2ndInt (o1).compareTo (extract2ndInt (o2));
}
private Integer extract2ndInt (String s)
{
Matcher m = Pattern.compile ("\\d+").matcher (s);
m.find ();
m.find ();
return Integer.parseInt (m.group ());
}
});
System.out.println (values [0]);
System.out.println (values [1]);
答案 3 :(得分:0)
我可以想到几种方法。
第一步 - 停止使用String。你自己承认,这个字符串“包含多个变量类型”。那不是字符串,它是一个类(字符串只是char
s的序列)。实际上代表它不仅会使这种情况变得更容易(并且不易出错),而且会在您需要使用它们的任何其他地方支付类似的红利。
因此,定义一些封装所涉及数据类型的类,如:
public class MyFoo {
final int firstNum;
final String firstDesc;
final int secondNum;
final String secondDesc;
final boolean trueFalseBit;
// Constructor, equals, hashcode etc. elided
}
然后,每当您第一次获得传递到系统中的str1
之类的字符串时,通过标记将其转换为MyFoo
的实例,将标记转换为整数等 - 适用于String格式的任何内容
现在您有一个具有不同具体类型字段的实际类,您可以正确地考虑按这些字段中的一个或多个进行排序。有两种方法可以做到这一点。
首先,您可以使您的类实现Comparable
并定义一个compare
方法,该方法将按此顺序排序。如果这是您的实例的“自然排序”,这才真正有意义;在大多数情况下作为默认排序的东西。
否则,您可以定义自己的Comparator<MyFoo>
实例,它使用您喜欢的顺序对对象进行排序。使用上面我的类的示例可能是:
Comparator<MyFoo> cmp = new Comparator<MyFoo>() {
public int compare(MyFoo a, MyFoo b) {
return b.secondNum - a.secondNum;
}
}
只需编写一个自定义Comparator<String>
来拉出每个字符串的“第二个int”,并相应地对它们进行排序。这将类似于您将这些字符串转换为类时使用的解析代码 - 可能类似于:
Comparator<String> cmp = new Comparator<String>() {
private int getSecondInt(String s) {
String[] parts = s.split(" ");
// TODO check length is at least 3
return Integer.parseInt(parts[2]);
// TODO handle exceptions
}
public int compare(String a, String b) {
return getSecondInt(b) - getSecondInt(a);
}
}
如果您只是使用这些字符串进行排序然后将它们丢弃,这种方式可能更有意义 - 因此构建完整对象几乎没有任何好处。