If this is your first visit, be sure to
check out the FAQ by clicking the
link above. You may have to register
before you can post: click the register link above to proceed. To start viewing messages,
select the forum that you want to visit from the selection below.

Need a help with search results sorting solution

I can not find an efficient solution for sorting search results from the database. My search results returns members of our service, including personal information about each member. Search can produce hundreds of results, and information about each member might contain his/her profile and essays, so I have to be careful about the memory.

The search results have to be sortable by member's age, activity , registration date and so on. I was thinking about a linked list of object (where each object represent a member). To sort this list I have to iterate through the list, extract the sorting parameter , sort them, and rebuild search results list in a new order.

I thought that may be someone had a similar task before, and knows an efficient way how to do that. I would appreciate any ideas. May be not only about sorting, but about cashing this search results as well.

Check out the Collections.sort(List list, Comparator cmp) method. If you
store the search results as separate object (i.e. records) in an ArrayList you
can implement the java.util.Comparator interface in some suitable class.
There you implement the compare and equals methods.
The public boolean equals method can just as well return false as it has no
effect on sorting.

The public int compare(Object ob1, Object ob2) must return a positive
value if ob1 > ob2, 0 if ob1==ob2 and a negative value if ob1 < ob2.

It can be done like this:

Store the records in an ArrayList of objects (SrcArrayList), say, RecordObj
that defines the fields of one record of retrieved data.

Make a separate class, say, SearchSorter that implements Comparator

Code the equals method like I said, and then code the compare method like this. This example sorts on ascending age, if age is equal it sorts on name:

Code:

public int compare(Object ob1, Object ob2) {
RecordObj rO1=(RecordObj)ob1;
RecordObj rO2=(RecordObj)ob2;
if (sStyle==SearchSorter.BY_AGE_AND_NAME) {
if (rO1.getAge() != rO2.getAge()) {
return rO1.getAge()-rO2.getAge();
}
// age is the same, let name decide, if name is the same
// then the sort sequence of rO1 and rO2 will be arbitrary.
return rO1.getName().compareTo(rO2.getName());
} else if (sStyle==SearchSorter.BY_SOME_OTHER_CRITERIA) {
// ...
}
}

The SearchSorter class could be supplied w. a setter method for a value that
tells it what sorting style it will use and you can set that value prior to
each ssrt.

You use it like this:

sStyle=SearchSorter.BY_AGE_AND_NAME; // a final static value you have defined in SearchSorter
searchSorterInstance.setSortStyle(sStyle);
Collections.sort(arrayListOfRecordObject, searchSorterInstance);

A new arrayListOfRecordObject is created for each sort, and will serve as
cache if you use another ArrayList for storing these arraylists.

I'll just add this to what sjalle posted: with a little bit of knowledge about reflection you can easily write a "DynamicComparator" class that can do any comparisons you would generally need based on sort parameters supplied at runtime. I wrote class like this for my employer's web apps so that we can sort query results based on user input without having to write comparators.

So when I want to sort a Collection based on user input I do something like this:

To do something like this you'll have to use some conventions in the objects you want to sort. For instance, my class only works if the specified sort fields have either a get method or are public variables, and unless the fields are Comparables they are converted to Strings and then compared.

Actually, there is probably a similar comparator class in Jakarta Commons somewhere though I haven't checked.