Sortieren von Klassen in ArrayList

mp89

Mitglied
Servus,

Situation:
Sortierproblem

Möchte gerne ArrayList<UserInfo> sortieren (Code siehe unten).

Klasse(n):

UserInfo.java

Java:
	//LDAP: telephoneNumber
	private String phoneNumber = new String();
	//LDAP: mobile
	private String mobileNumber = new String();
	//LDAP: cn
	private String name = new String();
	//LDAP: hrFirstName
	private String firstName = new String();
Es sind noch viele andere Felder mit Getter und Setter Methoden in der Klassen enthalten. Ist lediglich ein Auszug, reicht aber um das Problem zu beschreiben.


Sort.java

Java:
private ArrayList<UserInfo> sortStrings(ArrayList<UserInfo> userList, int sortCategory) {
ArrayList<String[]> list = new ArrayList<String[]>();
for(int i = 0; i < userList.size(); i++){
list.add(new String[]{userList.get(i).getFirstName(),Integer.toString(i)});
}
Collections.sort(list); //Hier liegt das Problemchen
//restlicher Code
}
Kann ich irgendwie angeben dass ich gerne nach immer dem 1. Index sortieren will (also nach dem FirstName hier)?
Oder gibts da ne einfachere Variante so eine Sortierung zu implementieren?

Thx4help!
Gruß Max
 
Oder gibts da ne einfachere Variante so eine Sortierung zu implementieren?
Schau mal hier:
Java:
package de.tutorials.reima.examples;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class CustomSort {
	static class UserInfo implements Comparable<UserInfo> {
		private String phoneNumber = new String();
		private String mobileNumber = new String();
		private String name = new String();
		private String firstName = new String();
		
		public UserInfo(String phoneNumber,
						String mobileNumber,
						String name,
						String firstName) {
			this.phoneNumber = phoneNumber;
			this.mobileNumber = mobileNumber;
			this.name = name;
			this.firstName = firstName;
		}

		@Override
		public int compareTo(UserInfo o) {
			return this.firstName.compareTo(o.firstName);
		}
		
		@Override
		public String toString() {
			return this.firstName + " " + this.name;
		}
	}	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ArrayList<UserInfo> list = new ArrayList<UserInfo>();
		list.add(new UserInfo("123", "456", "Smith", "Bob"));
		list.add(new UserInfo("789", "012", "Meyer", "Alice"));
		list.add(new UserInfo("789", "012", "Jones", "Carl"));
		System.out.println(list);
		
		// Benutzt UserInfo.compareTo():
		Collections.sort(list);
		
		// _oder_ mit anonymer innerer Klasse:
		Collections.sort(list, new Comparator<UserInfo>() {
			@Override
			public int compare(UserInfo o1, UserInfo o2) {
				return o1.firstName.compareTo(o2.firstName);
			}			
		});
		
		System.out.println(list); // => [Alice Meyer, Bob Smith, Carl Jones]
	}
}

Grüße, Matthias
 

mp89

Mitglied
Hat zwar nicht auf exakt auf meine Problemstellung gepasst, da ich durchaus die ganzen UserInfos auch nach anderen Values sortieren will, aber hab mir dann eben eine Klasse geschrieben die einen Value (zum Sortieren) und eine ID zum späteren Ordnen der ArrayList beinhaltet. Damit hats dann geklappt und ich kann nach was auch immer mir die Liste sortieren lassen.

Thx!

Gruß Max
 
Hat zwar nicht auf exakt auf meine Problemstellung gepasst, da ich durchaus die ganzen UserInfos auch nach anderen Values sortieren will, aber hab mir dann eben eine Klasse geschrieben die einen Value (zum Sortieren) und eine ID zum späteren Ordnen der ArrayList beinhaltet. Damit hats dann geklappt und ich kann nach was auch immer mir die Liste sortieren lassen.
Dazu noch eine Alternative:
Java:
package de.tutorials.reima.examples;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class CustomSort {
	static class UserInfo {
		private String phoneNumber = new String();
		private String mobileNumber = new String();
		private String name = new String();
		private String firstName = new String();
		
		public UserInfo(String phoneNumber,
						String mobileNumber,
						String name,
						String firstName) {
			this.phoneNumber = phoneNumber;
			this.mobileNumber = mobileNumber;
			this.name = name;
			this.firstName = firstName;
		}	
		
		@Override
		public String toString() {
			return this.firstName + " " + this.name;
		}
		
		public static Comparator<UserInfo> compareByName() {
			return new Comparator<UserInfo>() {
				@Override
				public int compare(UserInfo o1, UserInfo o2) {
					return o1.name.compareTo(o2.name);
				}				
			};
		}
		
		public static Comparator<UserInfo> compareByFirstName() {
			return new Comparator<UserInfo>() {
				@Override
				public int compare(UserInfo o1, UserInfo o2) {
					return o1.firstName.compareTo(o2.firstName);
				}				
			};
		}
		
		// etc.
	}	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ArrayList<UserInfo> list = new ArrayList<UserInfo>();
		list.add(new UserInfo("123", "456", "Smith", "Bob"));
		list.add(new UserInfo("789", "012", "Meyer", "Alice"));
		list.add(new UserInfo("345", "678", "Jones", "Carl"));
		
		Collections.sort(list, UserInfo.compareByName());		
		System.out.println(list); // => [Carl Jones, Alice Meyer, Bob Smith]
		
		Collections.sort(list, UserInfo.compareByFirstName());		
		System.out.println(list); // => [Alice Meyer, Bob Smith, Carl Jones]
	}
}
Grüße, Matthias
 

mp89

Mitglied
Damit hätte sich das Thema ja endgültig erledigt ^^.

Danke für die kompetente und schnelle Hilfe ! =)

Gruß Max