如何对此字符串进行排序并再次重建相同的排序字符串

时间:2013-11-11 11:28:15

标签: java sorting

我如何根据的整数部分

在此字符串中 排序

输入:

[160,190];[650,790];[901,974];[401,540];[60,90];

O / P:

[60,90];[160,190];[401,540];[650,790];[901,974];

  

显然,在这种情况下必须进行常规排序,但我不确定   我应该在哪里修剪字符串比较重建完全字符串   优化方法。

5 个答案:

答案 0 :(得分:1)

我实施Comparator interface;一个包含两个值的类然后:

  • 使用';'解析字符串作为分隔符并将其置于持有者类
  • 将所有持有者对象放入List
  • 使用已实施的比较器
  • 对列表进行排序

答案 1 :(得分:1)

使用Guava而不是重新实现大多数必要步骤。 第一部分,一旦使用Lambda表达式,解析字符串并将其转换为整数列表将会更好。

import static com.google.common.base.CharMatcher.anyOf;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Lists.transform;

import java.util.Collections;
import java.util.List;

import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.Iterables;

public class StrangeSort {

    public static void main(String[] args) {

        String input = "[160,190];[650,790];[901,974];[401,540];[60,90]";
        Splitter splitter = Splitter.on(anyOf("[],;")).omitEmptyStrings();
        // This will be so much nicer with Lambda Expressions
        List<Integer> list = newArrayList(transform(newArrayList(splitter.split(input)),
            new Function<String, Integer>() {
                @Override
                public Integer apply(String arg0) {
                    return Integer.valueOf(arg0);
                }}));
        // Sort the list
        Collections.sort(list);
        // Print the list
        String output = Joiner.on(';').join(Iterables.partition(list, 2));
        System.out.println(output);
    }
}

如果您需要删除输出中的空格,可以打印output.replaceAll(" ", "");

答案 2 :(得分:0)

通常的方法是用分隔符(;)拆分字符串,然后将元素插入到有序集(例如TreeSet)中。然后,您可以简单地遍历集合,并再次使用分隔符将元素连接到字符串中。由于您需要以数字方式排序,因此必须实现Comparator并将实例传递给TreeSet构造函数。

这种方法的好处是不需要外部排序。该集合将按排序顺序维护值,因此您只需遍历集合即可恢复已排序的元素。

答案 3 :(得分:0)

如果每个[]指定一个唯一的值范围,您可以提取所有数字,对它们进行排序,然后通过对每个[]中的两个元素进行分组来构建结果字符串。

Pattern pattern = Pattern.compile("(\\d+)");
Matcher matcher = pattern.matcher(s);
Set<Integer> numbers = new TreeSet<>();

while(matcher.find()) {
    numbers.add(Integer.parseInt(matcher.group(1)));
}

下一步是迭代numbers并使用当前和下一个索引来形成结果字符串。

更好的方法是将字符串拆分为;并使用@Sergey N Lukin的比较器对值进行排序

    String s = "[160,190];[650,790];[901,974];[401,540];[60,90];";
    String[] values = s.split(";");
    Set<String> sortedValues = new TreeSet<>(new TokensComparator());
    sortedValues.addAll(Arrays.asList(values));

最后,使用循环或Google Guava的;

以分号(Joiner)加入集合的元素
Joiner.on(';').join(sortedValues);

答案 4 :(得分:0)

简单示例:

import java.util.*;

public class Main {
      public static void main(String[] args){
          String s="[160,190];[650,790];[901,974];[401,540];[60,90]";
          String[] stringArray = s.split(";");
          Arrays.sort(stringArray,new TokensComparator());
          String newString=Main.join(stringArray,";");
          System.out.print(newString);
      }

    static String join(String[] stringArray, String delimiter) {
        StringBuilder builder = new StringBuilder();
        for (int i=0; i<stringArray.length; i++) {
            builder.append(stringArray[i]);
            builder.append(delimiter);
        }
        return builder.toString();
    }

    static class TokensComparator implements Comparator<String> {
        public int compare(String s1, String s2) {
            String token1 = s1.substring(1,s1.length()-1).split(",")[0];
            String token2 = s2.substring(1,s2.length()-1).split(",")[0];
            return Integer.compare(Integer.parseInt(token1),Integer.parseInt(token2));
        }
    }
  }