Almett:
私は、項目のリストは以下のような数字とアルファベットで構成されています:
オリジナルリスト:
Apple 1
Apple 1
Apple 4
Apple 1A
Apple 1B
Apple 1D
Apple 2A
Apple 2A
Apple 1C
Apple 1B
Apple 2C
Apple 10
Apple 11
Apple 5
Apple 11
Apple 8D
Banana 1
Banana 4
Banana 9D
Banana 9E
Banana 9C
Banana 13
Banana 16
これは、APIからの検索結果ですが、唯一のアルファベット順にソートApples
してBananas
。今、私は以下のような(ランダム文字A、B、C、D、Eが付属して桁)の数字で、それをソートしたいと思います:
A、B、C、D、Eの文字と数字は、数字とアルファベット順の両方でソートされるべきです。
期待のリスト:
Apple 1
Apple 1
Apple 1A
Apple 1B
Apple 1B
Apple 1C
Apple 1D
Apple 2
Apple 2A
Apple 2A
Apple 2C
Apple 4
Apple 5
Apple 8D
Apple 10
Apple 11
Banana 1
Banana 4
Banana 9C
Banana 9D
Banana 9E
Banana 13
Banana 16
私は、このソリューションを試してみましたが、それは項目によってすべてのアイテムを注文するには、以下のように0-9の数字で始まります。
private List<Location> sortLocationList(List<Location> locationArrayList){
Collections.sort(locationArrayList, new Comparator<Location>(){
@Override
public int compare(Location o1, Location o2){
return o1.getValue().compareToIgnoreCase(o2.getValue());
}
});
return locationArrayList;
}
public class Location{
public enum LocationType{ADDRESS, STREET, CITY}
private JavascriptObject object;
private LocationType locationType;
private String value;
public Location(LocationType locationType, String value, JavascriptObject object){
this.locationType = locationType;
this.value = value;
this.object = object;
}
}
私のソリューションは、これを返しています。
Apple 1
Apple 1
Apple 10
Apple 11
Apple 1A
Apple 1B
Apple 1B
Apple 1C
Apple 1D
Apple 2
Apple 2A
Apple 2A
Apple 2C
Apple 4
Apple 5
Apple 8D
Banana 1
Banana 13
Banana 16
Banana 4
Banana 9C
Banana 9D
Banana 9E
任意のより良い解決策は、このリストをソートするには?
前もって感謝します。
離れて渡します:
私はいつものようなパターンがあることを前提としています。
"something something"
すべての値に対して、そのgetValue()
メソッドが戻る
と2は、その"something"
常にまたは末尾文字なし番号で始まります。
スプリット以下のコード3つの部分内のすべてのそのような値と比較する
第1の部分をアルファベット
2部数値や
アルファベット3D部分:
private List<Location> sortLocationList(List<Location> locationArrayList){
Collections.sort(locationArrayList, new Comparator<Location>(){
@Override
public int compare(Location o1, Location o2){
String s1 = o1.getValue();
String s2 = o2.getValue();
if (s1.equalsIgnoreCase(s2))
return 0;
String[] tokens1 = s1.split(" ");
String[] tokens2 = s2.split(" ");
if (!tokens1[0].equalsIgnoreCase(tokens2[0]))
return s1.compareToIgnoreCase(s2);
int number1 = Integer.parseInt(tokens1[1].replaceAll("\\D", ""));
int number2 = Integer.parseInt(tokens2[1].replaceAll("\\D", ""));
if (number1 != number2)
return number1 - number2;
String suffix1 = tokens1[1].replaceAll("\\d", "");
String suffix2 = tokens2[1].replaceAll("\\d", "");
return suffix1.compareToIgnoreCase(suffix2);
}
});
return locationArrayList;
}