Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何对二维ArrayList进行排序_Java_Sorting_Multidimensional Array_Arraylist - Fatal编程技术网

Java 如何对二维ArrayList进行排序

Java 如何对二维ArrayList进行排序,java,sorting,multidimensional-array,arraylist,Java,Sorting,Multidimensional Array,Arraylist,我有一个包含双值的二维ArrayList: ArrayList<ArrayList<Double>> data = new ArrayList<ArrayList<Double>>(); ArrayList data=new ArrayList(); 与经典数组类似,我想对这个矩阵的“col”进行排序:我想在子数组列表中获取具有相同索引的项,然后对它们进行排序。比如为每一列调用Collections.sort()。。。 行是指外层和内层是列

我有一个包含双值的二维ArrayList:

ArrayList<ArrayList<Double>> data = new ArrayList<ArrayList<Double>>(); 
ArrayList data=new ArrayList();
与经典数组类似,我想对这个矩阵的“col”进行排序:我想在子数组列表中获取具有相同索引的项,然后对它们进行排序。比如为每一列调用Collections.sort()。。。 行是指外层和内层是列

正确的方法是什么? 我考虑对矩阵进行迭代以将其反转,然后使用集合对每一行进行排序。sort()?但也许这不是最好的解决方案,因为矩阵大约是400*7000

我不能使用经典数组,因为矩阵的大小未知


谢谢你的帮助。

我有两个疯狂的想法:要么实现你自己的排序算法,知道你的倒矩阵结构,要么编写一个集合实现,它将包装你的结构并表示列,以后可以用作Collections.sort()的参数。对于ArrayList,这应该相当快。

我想如果存储不是问题,您可以在ArrayList中使用SortedMap。这样,您就不必担心对元素进行排序

ArrayList<SortedMap<Double,byte>> data;
ArrayList数据;

执行以下操作:

    final int COLUMN = 5;
    Comparator<ArrayList<Double>> myComparator = new Comparator<ArrayList<Double>>() {
        @Override
        public int compare(ArrayList<Double> o1, ArrayList<Double> o2) {
            return o1.get(COLUMN).compareTo(o2.get(COLUMN));
        }
    };
    Collections.sort(list, myComparator);
final int COLUMN=5;

Comparator不确定我是否正确理解了Q,但这将对所有“列”进行排序(假设外层为行,内层为列):

final ArrayList data=new ArrayList();
//...
最终整数[]行=新整数[data.size()];

对于(inti=0;i,这里有一个类似于反转思想的选项,但不是反转整个内容,而是一次构建一列,排序并丢弃它

ArrayList<ArrayList<Double>> data = new ArrayList<ArrayList<Double>>(); 

for(int c=0; c<data.get(0).size(); c++) {
    List<Double> col = new ArrayList<Double>();
    for( int r=0; r<data.size(); r++ )
        col.add( data.get(r).get(c) );

    Collections.sort(col);

    for( int r=0; r<col.size(); r++ )
        data.get(r).set( c, col.get(r) );
}
ArrayList data=new ArrayList();

对于(int c=0;c,您必须访问所有元素,以便在任何情况下对它们进行排序

int temp[] = new temp[col.length];
int x = 0;
while(x < row.length)
{
    for(int i = 0; i<col.length; i++)
    {
        temp[i] = mat[x][i];
    }
    sort(temp);
    for(int i = 0; i<col.length; i++)
    {
        mat[x][i] = temp[i];
    }
x++;
}
int temp[]=新温度[col.length];
int x=0;
while(x<行长)
{

对于(inti=0;i,这里有一种将数据转换为对象数组的方法

final int column=3;
ArrayList数据=新的ArrayList();
//将数据转换为对象数组
Object[]temp=data.toArray();
sort(temp,new Comparator(){
@凌驾
公共整数比较(对象o1、对象o2){
//通过类型转换获取要比较的内部数组
ArrayList temp1=(ArrayList)o1;
ArrayList temp2=(ArrayList)o2;
//然后比较这些内部数组的索引
返回temp1.get(column.compareTo(temp2.get(column));
}
});
//清除旧列表并将有序列表添加到
data.clear();
用于(对象o:temp)
{
data.add((ArrayList)o);
}

我假设外层表示行,但如果您能在问题中说明这一点,那就太好了。双精度是特定的数字还是随机的?它们意味着什么?您有没有看过专门的矩阵库,例如?如果其中一个满足您的要求,可能会节省您很多时间。另外,您是否只想然后按c排序列?还是应该像矩阵中最小的元素应该在
0,0
处,最大的元素应该在
N,M
?@BarendGarvelink:我没有看到在您提供的链接中实现任何排序功能?这是一个很好的库,谢谢!)这将如何工作?它将按行排序,而这不是他想要的。我不认为行和列之间有明确的区别。此外,它只是一个逻辑显示,只有在遍历它时才能看到。这完全取决于所使用的遍历技术。OP不是要求按特定列排序,而是要求按sor排序我的理解是,他希望对所有列进行排序,因此我们实际上必须在列表之间移动双元素。@SarelBotha:是的,我希望对每一列进行独立排序,Collections.sort()的调用次数应与列数(=内部ArrayList的大小)相同.谢谢大家的回答,我今晚会仔细考虑一下,明天我会测试包装器解决方案,如果它不能像我希望的那样工作,我会按照trutheality的建议实现一个基本的解决方案,即使循环有点吓人^^^。
int temp[] = new temp[col.length];
int x = 0;
while(x < row.length)
{
    for(int i = 0; i<col.length; i++)
    {
        temp[i] = mat[x][i];
    }
    sort(temp);
    for(int i = 0; i<col.length; i++)
    {
        mat[x][i] = temp[i];
    }
x++;
}