Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sorting matched arrays in Java

Tags:

Let's say that I have two arrays (in Java),

int[] numbers; and int[] colors;

Each ith element of numbers corresponds to its ith element in colors. Ex, numbers = {4,2,1} colors = {0x11, 0x24, 0x01}; Means that number 4 is color 0x11, number 2 is 0x24, etc.

I want to sort the numbers array, but then still have it so each element matches up with its pair in colors.

Ex. numbers = {1,2,4}; colors = {0x01,0x24,0x11};

What's the cleanest, simplest way to do this? The arrays have a few thousand items, so being in place would be best, but not required. Would it make sense to do an Arrays.sort() and a custom comparator? Using library functions as much as possible is preferable.

Note: I know the "best" solution is to make a class for the two elements and use a custom comparator. This question is meant to ask people for the quickest way to code this. Imagine being at a programming competition, you wouldn't want to be making all these extra classes, anonymous classes for the comparator, etc. Better yet, forget Java; how would you code it in C?

like image 396
user16773 Avatar asked Sep 21 '08 21:09

user16773


People also ask

How do I sort two arrays simultaneously?

Solution without object overheadMake a third array. Fill it with indices from 0 to size-1 . Sort this array with comparator function polling into the array according to which you want to sort. Finally, reorder the elements in both arrays according to indices.

What is the best way to sort an array in Java?

Using the sort() Method In Java, Arrays is the class defined in the java.util package that provides sort() method to sort an array in ascending order. It uses Dual-Pivot Quicksort algorithm for sorting. Its complexity is O(n log(n)).

How do you sort elements in an ArrayList using comparable interface?

To sort an ArrayList using Comparator we need to override the compare() method provided by comparator interface. After rewriting the compare() method we need to call collections. sort() method like below.

Can you sort arrays in Java?

The sort() method is used to sort an array in Java. By default, it sorts an array in ascending order, but by using reverseOrder() inside it as a parameter, we can also get the array sorted in descending order.


2 Answers

You could use sort() with a custom comparator if you kept a third array with the index, and sorted on that, leaving the data intact.

Java code example:

Integer[] idx = new Integer[numbers.length]; for( int i = 0 ; i < idx.length; i++ ) idx[i] = i;               Arrays.sort(idx, new Comparator<Integer>() {     public int compare(Integer i1, Integer i2) {                                 return Double.compare(numbers[i1], numbers[i2]);     }                    });  // numbers[idx[i]] is the sorted number at index i // colors[idx[i]] is the sorted color at index i 

Note that you have to use Integer instead of int or you can't use a custom comparator.

like image 65
tovare Avatar answered Sep 29 '22 01:09

tovare


It seems like the cleanest thing to do would be to create a custom property class that implements Comparable. For example:

class Color implements Comparable {   private int number;   private int color;    // (snip ctor, setters, etc.)    public int getNumber() {     return number;   }   public int getColor() {     return color;   }    public int compareTo(Color other) {     if (this.getNumber() == other.getNumber) {       return 0;     } else if (this.getNumber() > other.getNumber) {       return 1;     } else {       return -1;     }   } } 

Then you can separate your sorting algorithm from the ordering logic (you could use Collections.sort if you use a List instead of an array), and most importantly, you won't have to worry about somehow getting two arrays out of sync.

like image 36
Frank Pape Avatar answered Sep 29 '22 00:09

Frank Pape