对 2d arraylist 进行排序并获取索引 java
sort 2d arraylist and get index java
我需要对二维数组 java 进行排序并获取排序元素的索引。为此,我写了这段代码
1.首先我做一个通用的class对数组元素进行排序,得到排序后元素的原始索引:
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
}
然后我用这个循环来排列数组列表 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 中。但我认为这完全没有效率有什么更好的想法吗?
您可以创建一个 class 包装原始索引:
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
您可以做的是创建一个单独的索引结构,其中包含指向数据(在本例中为索引)的指针,然后仅对索引结构进行排序。原始数据将保持不变。
这是一个例子
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 级别效率不高。你最好创建一对(索引,data_element),然后对整对进行排序。
当我们排序的对象是大对象时效率很高。
我需要对二维数组 java 进行排序并获取排序元素的索引。为此,我写了这段代码 1.首先我做一个通用的class对数组元素进行排序,得到排序后元素的原始索引:
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
}
然后我用这个循环来排列数组列表 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 中。但我认为这完全没有效率有什么更好的想法吗?
您可以创建一个 class 包装原始索引:
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
您可以做的是创建一个单独的索引结构,其中包含指向数据(在本例中为索引)的指针,然后仅对索引结构进行排序。原始数据将保持不变。
这是一个例子
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 级别效率不高。你最好创建一对(索引,data_element),然后对整对进行排序。
当我们排序的对象是大对象时效率很高。