-1

整数部分に基づいてこの文字列の値を並べ替えるにはどうすればよいですか

入力:

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

O/p:

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

明らかに、この場合は通常の並べ替えを行う必要がありますが、最適化されたアプローチで文字列を比較して正確な文字列を再構築する必要がある場所についてはわかりません。

4

5 に答える 5

1

必要な手順のほとんどを再実装する代わりに Guava を使用します。文字列を解析して整数のリストに変換する最初の部分は、ラムダ式を使用できるようになると、はるかに優れたものになります。

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 に答える
1

Comparator インターフェイスを実装します。ペアの両方の値を保持するクラス。

  • 「;」を使用して文字列を解析します デリメータとして、ホルダークラスに入れます
  • すべてのホルダー オブジェクトをリストに入れる
  • 実装されたコンパレータを使用してリストをソートします
于 2013-11-11T11:36:06.230 に答える
0

それぞれ[]が一意の値の範囲を指定している場合、すべての数値を抽出して並べ替え、それぞれの 2 つの要素をグループ化することで、結果の文字列を作成することができます[]

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

簡単な例:

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 に答える