Consider an arraylist as given below
unsortedList = {6,"ball",3,1,"apple","cat",4}
this needs to be sorted to
sortedList = {1,"apple",3,4,"ball","cat",6}
Sort the strings alphabetically. Sort the numbers in ascending. But note the following condition:
Notice that in the above example, all the integers are sorted ascending and all the strings are sorted ascending, but the relative positions of integers and strings is unchanged from before.
One option here is to do the following:
This is quite efficient - you just need to do two sorts. Here's some code for it:
public void relativeOrderSort(List<Object> list) {
/* Create a list of just the integers and just the strings
* from the original list.
*/
List<Integer> intList = new ArrayList<Integer>();
List<String> strList = new ArrayList<String>();
for (Object obj: list) {
if (obj instanceof Integer) {
intList.add((Integer) obj);
} else if (obj instanceof String) {
strList.add((String) obj);
} else {
throw new IllegalArgumentException("List has a non-int, non-string member.");
}
}
/* Sort the lists. */
Collections.sort(intList);
Collections.sort(strList);
/* Merge the lists back together. */
int intIndex = 0, strIndex = 0;
for (int i = 0; i < list.size(); i++) {
if (list.get(i) instanceof Integer) {
list.set(i, intList.get(intIndex++));
} else {
list.set(i, strList.get(strIndex++));
}
}
}
Hope this helps!
Pseudo code:
Create a list of the indices pointing to integers ({0,2,3,6} in your case - indxInt )
Sort the integers ({6,3,1,4} turns into {1,3,4,6})
Put them back at the locations given by the pointers:
sorted(indxInt(0)) = 1;
sorted(indxInt(1)) = 3;
sorted(3) = 4; // indxInt(2) == 3
sorted(6) = 6; // indxInt(3) == 6
Repeat for the strings
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With