-1

如何根据积分部分对该字符串中的值进行排序,即

输入:

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

开/关:

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

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

4

5 回答 5

1

我会实现Comparator 接口;一个持有一对的两个值的类,然后:

  • 使用 ';' 解析字符串 作为分隔符并将其放在持有人类中
  • 将所有持有者对象放入列表中
  • 使用实现的比较器对列表进行排序
于 2013-11-11T11:36:06.230 回答
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(" ", "");

于 2013-11-13T23:21:01.277 回答
0

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

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的 Comparator 对值进行排序

    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);
于 2013-11-11T11:44:52.733 回答
0

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

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

于 2013-11-11T11:40:04.163 回答
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));
        }
    }
  }
于 2013-11-11T11:50:08.883 回答