整数部分に基づいてこの文字列の値を並べ替えるにはどうすればよいですか
入力:
[160,190];[650,790];[901,974];[401,540];[60,90];
O/p:
[60,90];[160,190];[401,540];[650,790];[901,974];
明らかに、この場合は通常の並べ替えを行う必要がありますが、最適化されたアプローチで文字列を比較して正確な文字列を再構築する必要がある場所についてはわかりません。
必要な手順のほとんどを再実装する代わりに 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(" ", "");
Comparator インターフェイスを実装します。ペアの両方の値を保持するクラス。
それぞれ[]
が一意の値の範囲を指定している場合、すべての数値を抽出して並べ替え、それぞれの 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);
簡単な例:
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));
}
}
}