[英]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.