簡體   English   中英

同時排序兩個數組

[英]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+ 字節)和指針的性能損失(也惡化了緩存局部性)。

沒有對象開銷的解決方案

制作第三個數組。 用從0size-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

TreeMaphttp://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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM