对多数据类型字符串进行排序

时间:2013-02-04 17:58:48

标签: java sorting

有没有办法对包含多种数据类型的单个字符串进行排序?

例如:     //包含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"

4 个答案:

答案 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;
    }
}

Hacky Way

只需编写一个自定义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);
    }
}

如果您只是使用这些字符串进行排序然后将它们丢弃,这种方式可能更有意义 - 因此构建完整对象几乎没有任何好处。