同时排序两个数组

我现在正在学习和理解Java,在练习数组时我有一个疑问。 我编写了以下代码作为示例:

class example { public static void main(String args[]) { String a[] = new String[] {"Sam", "Claudia", "Josh", "Toby", "Donna"}; int b[] = new int[] {1, 2, 3, 4, 5}; for(int n=0;n<5;n++) { System.out.print (a[n] + "..."); System.out.println (b[n]); } System.out.println (" "); java.util.Arrays.sort(a); for(int n=0;n<5;n++) { System.out.print (a[n] + "..."); System.out.println (b[n]); } } 

简而言之,这个类创建了两个数组,每个数组有五个空格。 它用西翼的人物名字填充一个,并用一到五的数字填充另一个。 我们可以说这两个字符串中的数据彼此对应。

现在,程序使用Arrays.sort()对数组中的名称进行Arrays.sort() 。 再次打印数组后,您可以看到虽然名称现在按字母顺序排列,但数字不再对应,因为第二个数组未更改。

如何将第二个数组的内容混洗以匹配第一个数组的排序要求? 解决方案还必须灵活,以允许更改程序的范围和大小。 请不要发布任何答案,要求我改变arrays的方法,或者提出一种更“有效”的做事方式。 这是出于教育目的,我想直接解决所提供的示例代码。 提前致谢!

编辑:我不想创建一个额外的类,但我认为通过嵌套循环的某种forms的排序可能是一个选项,而不是Arrays.sort()。

下面是不使用任何Map Collection的代码,但是如果你想使用Map那么它变得非常容易。 将这两个数组添加到地图中并对其进行排序。

 public static void main(String args[]) { String a[] = new String[] { "Sam", "Claudia", "Josh", "Toby", "Donna" }; int b[] = new int[] { 1, 2, 3, 4, 5 }; for (int n = 0; n < 5; n++) { System.out.print(a[n] + "..."); System.out.println(b[n]); } System.out.println(" "); //java.util.Arrays.sort(a); /* Bubble Sort */ for (int n = 0; n < 5; n++) { for (int m = 0; m < 4 - n; m++) { if ((a[m].compareTo(a[m + 1])) > 0) { String swapString = a[m]; a[m] = a[m + 1]; a[m + 1] = swapString; int swapInt = b[m]; b[m] = b[m + 1]; b[m + 1] = swapInt; } } } for (int n = 0; n < 5; n++) { System.out.print(a[n] + "..."); System.out.println(b[n]); } } 

您必须将两个数组压缩成一个数组,其中元素是类的实例,如:

 class NameNumber { public NameNumber(String name, int n) { this.name = name; this.number = n; } public String name; public int number; } 

并使用自定义比较器对该数组进行排序。

你的代码应该是这样的:

 NameNumber [] zip = new NameNumber[Math.min(a.length,b.length)]; for(int i = 0; i < zip.length; i++) { zip[i] = new NameNumber(a[i],b[i]); } Arrays.sort(zip, new Comparator() { @Override public int compare(NameNumber o1, NameNumber o2) { return Integer.compare(o1.number, o2.number); } }); 

有些人建议制作产品类型。 只有当元素的数量很少时,这才是可行的。 通过引入另一个对象,您可以为每个元素添加对象开销(30+个字节)以及指针的性能损失(也会使缓存局部性恶化)。

无对象开销的解决方案

制作第三个数组。 用从0size-1索引填充它。 使用比较器函数对此数组进行排序,根据您要排序的数组进行轮询。

最后,根据索引重新排序两个数组中的元素。

替代解决方案

自己编写排序算法。 这并不理想,因为您可能会犯错误,排序效率可能会低于标准。

你想要的是不可能的,因为你不知道Arrays.sort是如何交换String数组中的元素的,所以没有办法相应地交换int数组中的元素。

您应该创建一个包含String名称和int位置作为参数的类,然后仅使用名称对此类进行排序,从而为Arrays.sort提供自定义比较器。

如果你想保留当前的代码(有2个数组,但这不是理想的解决方案),不要使用Arrays.sort并实现自己的排序算法。 当您交换两个名称时,获取它们的索引并相应地交换另一个数组中的两个整数。

你不应该有两个并行数组。 相反,您应该有一个WestWingCharacter对象数组,其中每个对象都有一个字段name和一个字段number

按名称编号排序此数组将是一块蛋糕:

 Collections.sort(characters, new Comparator() { @Override public int compare(WestWingCharacter c1, WestWingCharacter c2) { return c1.getName().compareTo(c2.getName(); } }); 

或者,使用Java 8:

 Collections.sort(characters, Comparator.comparing(WestWingCharacter::getName)); 

Java是一种OO语言,因此您应该使用对象。

数组没有以任何方式链接。 就像有人指出一样看看

SortedMap http://docs.oracle.com/javase/7/docs/api/java/util/SortedMap.html

TreeMap http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html

这是您的查询的答案。

 public class Main { public static void main(String args[]){ String name[] = new String[] {"Sam", "Claudia", "Josh", "Toby", "Donna"}; int id[] = new int[] {1, 2, 3, 4, 5}; for ( int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { int dtmp=0; String stmp=null; if (id[i] > id[j]) { dtmp = rate[i]; id[i] = id[j]; id[j] = dtmp; stmp = name[i]; name[i]=name[j]; name[j]=stmp; } } } System.out.println("Details are :"); for(int i=0;i