Java 如何对二维ArrayList进行排序
我有一个包含双值的二维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<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++;
}