Posts Tagged sorting

Sorting Java Collections

Java collections are most of the data structures that come with the language, they share the same basics methods thanks to the collection interface, one of the most common things you may want to do with a collection, besides adding and removing elements, is sorting them.

Let’s see an example with ArrayList

public class Sorting {

	private final static ArrayList numbers = new ArrayList();

	public static void main(String[] args) {

		numbers.add(10);
		numbers.add(5);
		numbers.add(25);

		Collections.sort(numbers);
		System.out.println(numbers);
	}
}

Sorting an ArrayList of integers is as easy as using “Collections.sort” since Java already knows how to sort numbers, but what if we wanted to sort an array of objects? How does Java know which object is worth more than other? Well we need to tell Java how to compare our objects implementing the Comparator interface

Here is an example:

private ArrayList
articles = new ArrayList(); articles.add(new Article("gel27", 200)); private void sortArticles() { Collections.sort(articles, new Comparator
() { @Override public int compare(Article art1, Article art2) { char a1 = art1.getArticleCode().charAt(0); char a2 = art2.getArticleCode().charAt(0); if (a1 > a2) { return 1; } else if (a1 == a2) { return 0; } else { return -1; } } }); }

We implement Comparator using an anonymous class and override the compare method, this method arguments are the two objects to be compared and returns an int, 1 if the first object is greater than the second, 0 if they are equal and -1 if the second object is greater than the first one, you can pick any field from your object to perform the comparison, in this case I’m using the first character of the article code so the result will be an alphabetical ordered array, you could also use the compareTo method if you want to use the whole string instead of just the first character.

, , , , , ,

Leave a comment

Ruby: fine grained sorting

If we had this array: ["abc", "aaa", "add", "bcc", "baa"] sorting normally we would get:

["aaa", "abc", "add", "baa", "bcc"]

Let’s say we wanted to sort by the second letter, we could do this using the sort_by method:

a.sort_by { |a| a[1] }
["baa", "aaa", "abc", "bcc", "add"]

Now lets see a more complex example, if we wanted to sort an email list:

earl@company.com
brett@random.com
abel@company.com
forest@random.com

First by the host name and then by the user name we can use the sort_by method like this:

sorted_emails = emails.sort_by { |e| [ e[/@.*/], e[/.*@/] ] }

We pass a block to sort_by with the ‘rules’ we want to sort by, we are using a regular expression to express how we want to sort, they are /@.*/ which matches everything after the at sign and /.*@/ which matches everything before.

Finally we can apply the same idea to uniq so that we can get unique data based on a pattern, I use this in Dirfuzz to filter the results and avoid duplicates when I have duplicate results that aren’t exactly the same.

@rel_links.sort.uniq { |link| link[/(?:\/\w+)+/] }

This regexp will allow me to get rid of duplicates with this data:

/community/lists/
/community/lists
/community/lists/#clp

This would stay the same with a simple uniq, but passing a block with that regexp will get rid of the duplicates.

, , , , , ,

Leave a comment

%d bloggers like this: