0

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

示例: //一个包含 int 和 words(strings) 的字符串 String str1 = "1 one 2 two t"; String str2 = "1 二 3 二 t"; String str3 = "1 三 1 二 t";

假设我想按这三个字符串中的第二个 int 对其进行排序。

有没有办法告诉java搜索字符串的特定部分?

所以我想要的输出是这样的列表:

str3
str1
str2

or 

"1 three 1 two t"
"1 two 2 two t"
"1 one 3 two t"
4

4 回答 4

1

对单个进行排序是什么意思String?您应该将字符串拆分为要排序的任何分组,然后对其进行排序。如果您的数据具有特定格式,您应该编写一个简短的、简单class的包含拆分为适当字段的元素。

于 2013-02-04T18:00:44.323 回答
0

在你编辑你的问题之前,我假设你有一个字符串列表,就像你的问题中定义的那样。

在这种情况下,您可以使用自己的 Comparator 执行此操作,没有错误检查,但您会看到这个想法:

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());
于 2013-02-04T18:07:12.000 回答
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]);
于 2013-02-04T18:07:37.067 回答
0

我可以想到几种方法来做到这一点。

正确的方式

第一步 - 停止使用字符串。你自己承认,这个字符串“包含多种变量类型”。那不是字符串,它是一个类(字符串只是chars 的序列)。实际上这样表示它不仅会使这种情况更容易(并且更不容易出错),而且会在您需要使用它们的任何其他地方支付类似的红利。

因此,定义一些封装所涉及的数据类型的类,例如:

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,将标记转换为整数等 - 适合字符串格式的任何内容。

现在您已经有了一个具有不同具体类型字段的实际类,您可以正确地考虑按这些字段中的一个或多个进行排序。那么有两种方法可以做到这一点。

首先,您可以让您的类实现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);
    }
}

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

于 2013-02-04T18:09:51.133 回答