Sorting two arrays simultaneously

2019-01-07 22:12发布

I'm learning and understanding Java now, and while practising with arrays I had a doubt. I wrote the following code as an example:

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]);
        }
    }

In a nutshell, this class created two arrays with five spaces each. It fills one with names of characters from the West Wing, and fills the other with numbering from one to five. We can say that the data in these two strings corresponds to each other.

Now, the program sorts the array with the names in it using Arrays.sort(). After printing the array again, you can see that while the names are now in alphabetical order, the numbers do not correspond anymore as the second array is unchanged.

How can I shuffle the contents of the second array to match the sort requirements of the first? The solution must also be flexible to allow for changes in the scope and size of the program. Please do not post any answers asking me to change my methodology with the arrays, or propose a more 'efficient' way of doing things. This is for educational purposed and I'd like a straight solution to the example code provided. Thanks in advance!

EDIT: I do NOT want to create an additional class, however I think some form of sorting through nested loops might be an option instead of Arrays.sort().

7条回答
爷的心禁止访问
2楼-- · 2019-01-07 22:25

Here is the answer for your query.

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]);
        }
    }
}
查看更多
3楼-- · 2019-01-07 22:26

What you want is not possible because you don't know internally how Arrays.sort swap the elements in your String array, so there is no way to swap accordingly the elements in the int array.

You should create a class that contains the String name and the int position as parameter and then sort this class only with the name, providing a custom comparator to Arrays.sort.

If you want to keep your current code (with 2 arrays, but this not the ideal solution), don't use Arrays.sort and implement your own sorting algorithm. When you swap two names, get the index of them and swap the two integers in the other array accordingly.

查看更多
姐就是有狂的资本
4楼-- · 2019-01-07 22:35

Below is the code without using any Map Collection, but if you want to use Map then it becomes very easy. Add both the arrays into map and sort it.

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]);
    }
}
查看更多
Ridiculous、
5楼-- · 2019-01-07 22:37

You have to ZIP your two arrays into an array which elements are instances of a class like:

class NameNumber 
{

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

    public String name;
    public int number;
}  

And sort that array with a custom comparator.

Your code should be something like:

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);
    }
});
查看更多
6楼-- · 2019-01-07 22:42

The arrays are not linked in any way. Like someone pointed out take a look at

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

查看更多
家丑人穷心不美
7楼-- · 2019-01-07 22:44

Some people propose making a product type. That is feasible only if the amount of elements is small. By introducing another object you add object overhead (30+ bytes) for each element and a performance penalty of a pointer (also worsening cache locality).

Solution without object overhead

Make a third array. Fill it with indices from 0 to size-1. Sort this array with comparator function polling into the array according to which you want to sort.

Finally, reorder the elements in both arrays according to indices.

Alternative solution

Write the sorting algorithm yourself. This is not ideal, because you might make a mistake and the sorting efficiency might be subpar.

查看更多
登录 后发表回答