[英]Sorting two arrays simultaneously
我现在正在学习和理解 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.sort()。
下面是没有使用任何Map
Collection 的代码,但是如果你想使用Map
那么它变得非常容易。 将两个数组添加到 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]);
}
}
有些人建议制作产品类型。 只有当元素数量很少时,这才是可行的。 通过引入另一个对象,您为每个元素增加了对象开销(30+ 字节)和指针的性能损失(也恶化了缓存局部性)。
制作第三个数组。 用从0
到size-1
索引填充它。 使用比较器函数轮询将此数组排序到您要排序的数组中。
最后,根据索引对两个数组中的元素重新排序。
自己编写排序算法。 这并不理想,因为您可能会犯错误并且排序效率可能低于标准。
您必须将两个数组压缩到一个数组中,该数组的元素是类的实例,例如:
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<NameNumber>() {
@Override
public int compare(NameNumber o1, NameNumber o2) {
return Integer.compare(o1.number, o2.number);
}
});
你不应该有两个并行数组。 相反,您应该有一个WestWingCharacter
对象数组,其中每个对象都有一个字段name
和一个字段number
。
按名称的数量对这个数组进行排序将是小菜一碟:
Collections.sort(characters, new Comparator<WestWingCharacter>() {
@Override
public int compare(WestWingCharacter c1, WestWingCharacter c2) {
return c1.getName().compareTo(c2.getName();
}
});
或者,使用 Java 8:
Collections.sort(characters, Comparator.comparing(WestWingCharacter::getName));
Java 是一种面向对象的语言,因此您应该使用对象。
您想要的是不可能的,因为您不知道Arrays.sort
在内部如何交换 String 数组中的元素,因此无法相应地交换 int 数组中的元素。
您应该创建一个包含String
名称和int
位置作为参数的类,然后仅使用名称对此类进行排序,为Arrays.sort
提供自定义比较器。
如果您想保留当前代码(有 2 个数组,但这不是理想的解决方案),请不要使用Arrays.sort
并实现您自己的排序算法。 当您交换两个名称时,获取它们的索引并相应地交换另一个数组中的两个整数。
这是您查询的答案。
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<n;i++){
System.out.println(name[i]+" - "+id[i]);
}
}
}
数组没有以任何方式链接。 就像有人指出的那样看看
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
import java.util.*;
class mergeArrays2
{
public static void main(String args[])
{
String a1[]={"Sam", "Claudia", "Josh", "Toby", "Donna"};
Integer a2[]={11, 2, 31, 24, 5};
ArrayList ar1=new ArrayList(Arrays.asList(a1));
Collections.sort(ar1);
ArrayList ar2=new ArrayList(Arrays.asList(a2));
Collections.sort(ar2);
System.out.println("array list"+ar1+ " "+ar2);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.