Comparator
と書くことができます。オブジェクトタイプ、フィールドタイプ、ソートしたいフィールドを渡すことができますか?オブジェクトタイプUser
のString
というフィールドemail
の並べ替えに対応するために、http://www.davekoelle.com/files/AlphanumComparator.javaを少し変更しました。私は動作するこのコードを持っています。オブジェクトタイプとフィールドをコンパレータに渡す
public class Main {
public static void main(String[] args) {
List<User> users = new ArrayList<>();
users.add(new User(7, "user1", "[email protected]"));
users.add(new User(11, "user20", "[email protected]"));
users.add(new User(5, "admin20", "[email protected]"));
users.add(new User(10, "user11", "[email protected]"));
users.add(new User(6, "admin21", "[email protected]"));
users.add(new User(12, "user21", "[email protected]"));
users.add(new User(8, "user2", "[email protected]"));
users.add(new User(1, "admin1", "[email protected]"));
users.add(new User(3, "admin10", "[email protected]"));
users.add(new User(2, "admin2", "[email protected]"));
users.add(new User(9, "user10", "[email protected]"));
users.add(new User(4, "admin11", "[email protected]"));
for (User item : users) {
System.out.println(item.getEmail());
}
System.out.println("__________________________");
Collections.sort(users, new AlphanumComparator());
for (User item : users) {
System.out.println(item.getEmail());
}
}
}
。
public class User {
int id;
String name;
String email;
// Constructor, Getters and Setters
}
。
public class AlphanumComparator implements Comparator<User> {
private final boolean isDigit(char ch) {
return ((ch >= 48) && (ch <= 57));
}
/**
* Length of string is passed in for improved efficiency (only need to calculate it once)
**/
private final String getChunk(String s, int slength, int marker) {
StringBuilder chunk = new StringBuilder();
char c = s.charAt(marker);
chunk.append(c);
marker++;
if (isDigit(c)) {
while (marker < slength) {
c = s.charAt(marker);
if (!isDigit(c))
break;
chunk.append(c);
marker++;
}
} else {
while (marker < slength) {
c = s.charAt(marker);
if (isDigit(c))
break;
chunk.append(c);
marker++;
}
}
return chunk.toString();
}
public int compare(User u1, User u2) {
if ((u1 == null) || (u2 == null)) {
return 0;
}
int thisMarker = 0;
int thatMarker = 0;
int s1Length = u1.getEmail().length();
int s2Length = u2.getEmail().length();
while (thisMarker < s1Length && thatMarker < s2Length) {
String thisChunk = getChunk(u1.getEmail(), s1Length, thisMarker);
thisMarker += thisChunk.length();
String thatChunk = getChunk(u2.getEmail(), s2Length, thatMarker);
thatMarker += thatChunk.length();
// If both chunks contain numeric characters, sort them numerically
int result = 0;
if (isDigit(thisChunk.charAt(0)) && isDigit(thatChunk.charAt(0))) {
// Simple chunk comparison by length.
int thisChunkLength = thisChunk.length();
result = thisChunkLength - thatChunk.length();
// If equal, the first different number counts
if (result == 0) {
for (int i = 0; i < thisChunkLength; i++) {
result = thisChunk.charAt(i) - thatChunk.charAt(i);
if (result != 0) {
return result;
}
}
}
} else {
result = thisChunk.compareTo(thatChunk);
}
if (result != 0)
return result;
}
return s1Length - s2Length;
}
}
どのように私は、オブジェクトタイプ、フィールドタイプと私はAlphanumComparator
にMain
クラスにCollections.sort(users, new AlphanumComparator());
からでソートするように、私はAlphanumComparator
でこれに対処することができますどのようにフィールドを渡すことができますか?したがってこの場合、オブジェクトタイプUser
フィールドemail
とフィールドタイプString
を渡します。しかし、私がid
を並べ替えたい場合は、オブジェクトタイプUser
、フィールドemail
、フィールドタイプint
を渡します。
リストを 'user.id'でソートしたいのですか?フィールドを直接比較するだけです。 – Killjoy1221