排序第一个数组并按照第一个新位置排列第二个数组元素

时间:2016-01-04 20:28:45

标签: java arrays sorting

问题是我有2个数组int input2[]={5,1,9,3,8};int input3[]={2,0,3,6,1};
 已经使用Arrays.sort(input2);对数组input2进行了排序现在我想根据数组inputs3

元素的新位置将元素放在数组input2

输入数组前排序 - 5,1,9,3,8 输入数组post Sort - 1,3,5,8,9 现在,数组input3的元素也应该根据数组input2的位置而改变 preSort 2,0,3,6,1 发布排序0,6,2,1,3

虽然我已编写代码,但正在寻找最佳解决方案enter code here

private static int[] swap(int[] arr, int i, int j,int [] arr2) {
    arr2[i]=arr[j];
    return arr2;
}

public static void main(String[] args) {
    int input2[]={5,1,9,3,8};
    int input3[]={2,0,3,6,1};
    int []temp=input2.clone();
    int []input4=input3.clone();
    Arrays.sort(input2);

    for(int i=0;i<=input2.length-1;i++){
        for(int j=0;j<=input2.length;j++){
            if(input2[i]==temp[j]){
                input4= swap(input3,i,j,input4);
                break;
            }  
        } 
    }        
}

4 个答案:

答案 0 :(得分:3)

据推测,这些价值观(input2input3)彼此之间存在某种关系?比如,它们是某些点的x,y坐标,或类似的东西?如果是这样,您应该将它们放在一些对象中,然后对对象进行排序。

public class Point {
    private final int x;
    private final int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    @Override
    public String toString() {
        return x + ", " + y;
    }
}

public void sortPoints() {
    int xs[] = { 5, 1, 9, 3, 8 };
    int ys[] = { 2, 0, 3, 6, 1 };
    List<Point> points = new ArrayList<>();
    for (int i = 0; i < xs.length; ++i) {
        points.add(new Point(xs[i], ys[i]));
    }

    Collections.sort(points, (a, b) -> a.getX() - b.getX());

    points.forEach(p -> System.out.println(p.getY())); 
}

答案 1 :(得分:1)

除了制作课程的其他解决方案之外,还有另一种解决方案,

public class SortTesting {
    public static void main(String[] args) {
        HashMap map = new HashMap();
        TreeMap sortedMap = new TreeMap();

        map.put(5, 2);
        map.put(1, 0);
        map.put(9, 3);
        map.put(3, 6);
        map.put(8, 1);

        sortedMap.putAll(map);
        System.out.println("results: " + sortedMap);
    }
}

答案 2 :(得分:0)

您可以更改交换方法,以便一次同时切换要交换的所有列表的元素。

private static int[] swap(int i, int j,List<int[]>  listOfArrays) {
       for(int[] array : listOfArrays) {
           int tmp = array[i];
           array[i]=array[j];
           array[j]=tmp;
       }
       return arr2;
}

但你必须自己编写。

另一种选择是使用功能接口并在比较时交换第三个数组。用

Arrays.sort(T[] a, Comparator<? super T> c)

方法

换句话说,在对它进行排序后已经很晚了,你必须在排序时这样做。或者初始数组需要重构。

答案 3 :(得分:0)

假设您有Java 8,您可以生成一个Integer索引数组(使用Integer因为lambda compare不能与基元一起使用),根据input2对索引数组进行排序,然后根据输入2重新排序input2和input3指数数组。

package x;
import java.util.Arrays;
public class x {
    public static void main(String[] args) {
        int input2[]={5,1,9,3,8}; 
        int input3[]={2,0,3,6,1};
        // generate array of indices
        Integer[] I = new Integer [input2.length];
        for(int i = 0; i < I.length; i++)
            I[i] = i;
        // sort array of indices according to input2
        Arrays.sort(I, (i, j) -> input2[i]-input2[j]);
        // reorder input2 and input3 in place using sorted indices
        // also reorder indices back to 0 to length-1
        // time complexity is O(n)
        for(int i = 0; i < I.length; i++){
            if(i != I[i]){
                int t2 = input2[i];
                int t3 = input3[i];
                int j;
                int k = i;
                while(i != (j = I[k])){
                    input2[k] = input2[j];
                    input3[k] = input3[j];
                    I[k] = k;
                    k = j;
                }
                input2[k] = t2;
                input3[k] = t3;
                I[k] = k;
            }
        }
        // display result
        for (int i = 0; i < input2.length; i++) {
            System.out.println("input2 " + input2[i] + " input3 " + input3[i]);
        }
    }
}