プロジェクトで番地を並べ替える必要があります。しかし、私の問題の正確なロジックは得られませんでした。
リストは次のとおりです。
9-11, 9-01, 10-02, 10-01, 2-09, 3-88, 9-03
上記のリストを次のように並べ替える必要があります。
2-09, 3-88, 9-01, 9-03, 9-11, 10-01, 10-02
上記のような出力が必要です。
Javaコーディングで誰か助けてくれますか?
私はあなたが解決した問題を共有しています。あなたが望むものを正確に得るのに役立つかもしれません...
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class HouseNo {
public HouseNo(String house, String block) {
this.houseno = house;
this.blockno = block;
}
private String houseno;
private String blockno;
public String getHouseno() {
return houseno;
}
public void setHouseno(String houseno) {
this.houseno = houseno;
}
public String getBlockno() {
return blockno;
}
public void setBlockno(String blockno) {
this.blockno = blockno;
}
public static class SortByHouseNo implements Comparator<HouseNo> {
@Override
public int compare(HouseNo o1, HouseNo o2) {
Integer first = Integer.valueOf(o1.getHouseno());
Integer second = Integer.valueOf(o2.getHouseno());
Integer f1 = Integer.valueOf(o1.getBlockno());
Integer f2 = Integer.valueOf(o2.getBlockno());
if (first.compareTo(second) == 0) {
return f1.compareTo(f2);
}
return first.compareTo(second);
}
}
@Override
public String toString() {
return "House -> " + this.getHouseno() + "-" + this.getBlockno();
}
public static void main(String[] args) {
// Final
String houseList[] = { "9-11", "9-01", "10-02", "10-01", "2-09",
"3-88", "9-03", "9-3" };
HouseNo house = null;
ArrayList<HouseNo> sortedList = new ArrayList<>();
for (String string : houseList) {
String h = string.substring(0, string.indexOf('-'));
String b = string.substring(string.indexOf('-') + 1);
house = new HouseNo(h, b);
sortedList.add(house);
}
System.out.println("Before Sorting :: ");
for (HouseNo houseNo : sortedList) {
System.out.println(houseNo);
}
Collections.sort(sortedList, new SortByHouseNo());
System.out.println("\n\nAfter Sorting HouseNo :: ");
for (HouseNo houseNo : sortedList) {
System.out.println(houseNo);
}
}
}
更新されたソリューション......
リストから「-」を削除するだけです
9-11, 9-01, 10-02, 10-01, 2-09, 3-88, 9-03
になる
911, 901, 1002, 1001, 209, 388, 903
選別
209, 388, 901, 903, 911, 1001, 1002
「ー」を後ろから2ヶ所飛ばして配置
2-09, 3-88, 9-01, 9-03, 9-11, 10-01, 10-02
そのような単純な !
このようにしてください
あなたのコンパレータ
class SimpleComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
String [] o1sub = o1.split("-");
String [] o2sub = o2.split("-");
int value1 = Integer.parseInt(o1sub[0]);
int value2 = Integer.parseInt(o2sub[0]);
if(value1!=value2){
return new Integer (value1).compareTo(value2);
}
int value3 = Integer.parseInt(o1sub[1]);
int value4 = Integer.parseInt(o2sub[1]);
if(value3!=value4){
return new Integer(value3).compareTo(value4);
}
return 0;
}
}
データ
String [] array ={"9-11","9-01","10-02","10-01","2-09","3-88","9-03"};
並べ替え
Arrays.sort(array,new SimpleComparator());
System.out.println(Arrays.toString(array));
出力
[2-09, 3-88, 9-01, 9-03, 9-11, 10-01, 10-02]
ここでのロジックは単純です。
209 < 388 < 901 < 902 < 911 < 1001 < 1002
考えられる解決策の1つは次のとおりです。
String[] input = {"9-11", "9-01", "10-02", "10-01", "2-09", "3-88", "9-03"};
Map<Integer, String> map = new TreeMap<Integer, String>();
for (String s : input) {
map.put(Integer.valueOf(s.replace("-", "")), s);
}
TreeSet<Integer> set = new TreeSet<Integer>(map.keySet());
String[] output = new String[input.length];
int i = 0;
for (Integer key : set) {
output[i++] = map.get(key);
}
より柔軟なフォーマットをサポートしたい場合は、 Comparable を実装して正確な比較ルールを定義できます。変更された例を見てみましょう。
class HouseNumber implements Comparable<HouseNumber>{
private Integer house;
private Integer flat;
private HouseNumber(String s) {
String[] fields = s.split("-");
house = Integer.valueOf(fields[0]);
flat = Integer.valueOf(fields[1]);
}
@Override
public int compareTo(HouseNumber o) {
if (house.compareTo(o.house) == 0) {
return flat.compareTo(o.flat);
}
return house.compareTo(o.house);
}
}
String[] input = {"9-11", "9-01", "10-02", "10-01", "2-09", "3-88", "9-03"};
Map<HouseNumber, String> map = new TreeMap<HouseNumber, String>();
for (String s : input) {
map.put(new HouseNumber(s), s);
}
TreeSet<HouseNumber> set = new TreeSet<HouseNumber>(map.keySet());
String[] output = new String[input.length];
int i = 0;
for (HouseNumber key : set) {
output[i++] = map.get(key);
}