Path: csiph.com!x330-a1.tempe.blueboxinc.net!newsfeed.hal-mli.net!feeder1.hal-mli.net!aioe.org!.POSTED!not-for-mail From: Warren Tang Newsgroups: comp.lang.java.help Subject: Re: Array sort problem. Date: Wed, 19 Oct 2011 10:59:30 +0800 Organization: Aioe.org NNTP Server Lines: 71 Message-ID: References: <11614444.1991.1318892090322.JavaMail.geo-discussion-forums@prmr25> NNTP-Posting-Host: d+WkA+lehfB0BQZIKBxcuA.user.speranza.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Complaints-To: abuse@aioe.org User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1 X-Notice: Filtered by postfilter v. 0.8.2 Xref: x330-a1.tempe.blueboxinc.net comp.lang.java.help:1266 On 10/18/2011 6:54 AM, Lew wrote: > Alex Mentis wrote: >> Warren Tang wrote: >>> I have an array: >>> >>> index value >>> 0 33 >>> 1 22 >>> 2 44 >>> 3 11 >>> >>> Now I'd like to sort it, but I also need to preserve the original >>> index, like this: >>> >>> newIndex originalIndex sortedValue >>> 0 3 11 >>> 1 1 22 >>> 2 0 33 >>> 3 2 44 >>> >>> How can this be done conveniently in Java? >> >> I imagine you'd have to go through the array of values and turn it into >> an array of objects that contain fields for both the original index and >> value. Then sort the new array based on the values. > > +1 > > Here's a rough outline of such a (value,index) type (not compiled, untried): > > public class ValueIndex > implements Comparable> > { > private final T value; > private final int index; > public ValueIndex( T val, int idx ) > { > if (val == null) {throw new IllegalArgumentException("null value");} > this.value = val; > this.index = idx; > assert this.value != null; > } > public T getValue() {assert value != null; return value;} > public int getIndex() {return index;} > @Override public int compareTo(ValueIndex other) > { > return other == null ? 1 : getValue().compareTo( other.getValue() ); > } > } > > I had thought to swap the "keys" and "values", and the use a TreeMap to sort it as follows: int[] scores = {33, 22, 44, 11}; TreeMap map = new TreeMap(); for(int i = 0; i < scores.length; i++) { map.put(scores[i], i); } int j = 0; for(Entry e : map.entrySet()) { System.out.println(String.format("%10d%10d%10d", j++, e.getValue(), e.getKey())); } But it won't work if "values" have duplicates. So I have to define a new class after all. Thank you guys for the answer. Regards, Warren Tang