排序2d arraylist并获取索引java

时间:2015-02-11 22:16:34

标签: java eclipse sorting indexing arraylist

我需要对二维arrylist java进行排序并获取已排序元素的索引。为此,我写了这段代码 1.首先,我创建一个通用类来对数组元素进行排序,并获得已排序元素的原始索引:

public static int[] Sort_Index(double[] arr){
            int[] indices = new int[arr.length];
                indices[0] = 0;
                for(int i=1;i<arr.length;i++){
                    int j=i;
                    for(;j>=1 && arr[j]<arr[j-1];j--){
                            double temp = arr[j];
                            arr[j] = arr[j-1];
                            indices[j]=indices[j-1];
                            arr[j-1] = temp;
                    }
                    indices[j]=i;
                }
                return indices;//indices of sorted elements
        }

然后我用这个循环来安排arraylist y

for(int i=0;i<Input.General_Inputs.Num_objectives;i++){
            double[] sort_y=new double[y.size()];
            for(int row=0;row<y.size();row++)
                sort_y[row]=y.get(row).get(Input.General_Inputs.Num+i);
            int[] sort_y_index=Sort_Index(sort_y);

        }
    }

我的下一步是使用此索引将y arraylist中的值存储到新的arraylist中。但我认为这对任何更好的想法都是完全没有效率的吗?

2 个答案:

答案 0 :(得分:1)

您可以做的是创建一个单独的索引结构,其中包含指向数据的指针(在本例中为索引),并对索引结构进行排序。原始数据将保持不变。

这是和示例

public static void main(String[] args) {
    double[] data = new double[]{123.123, 345.345, -5, 10, -123.4};
    ArrayList<Integer> index = new ArrayList<>(data.length);
    for(int i = 0; i<data.length; i++) {
        index.add(i);
    }
    Collections.sort(index, new Comparator<Integer>() {

        @Override
        public int compare(Integer o1, Integer o2) {
            return Double.compare(data[o1], data[o2]);
            //notice that we are comparing elements of the array *data*,
            //but we are swapping inside array *index*
        }
    });
    for(int i = 0; i<index.size(); i++) {
        System.out.println(data[index.get(i)]);
    }
}

因此,您可以获取已排序的数据并保留原始索引。

性能方面,由于内存大量跳跃,因此在小型元素的CPU级别上效率不高。你最好创建一对(index,data_element),然后对整个对进行排序。

当我们排序的对象是大对象时,效率很高。

答案 1 :(得分:0)

您可以创建一个包装原始索引的类:

private static class ElementWithIndices<E> {
    private final E e;
    private final int i;
    private final int j;
    // + constructor, getters, setters
}

然后:

List<List<E>> list = // ...
List<List<ElementWithIndices<E>>> listWithIndices = convert(list);
Collections.sort(listWithIndices, myComparator); // compare on the Es
// listWithIndices now contains the sorted elements with their original indices