[英]Java: sort a list of lists
我有一個點列表列表,即: List<List<Point>>
。 例如:
List<Point> lp;
List<List<Point>> Llp;
Llp.add(lp);
lp
將是我矩陣的第一行(x = 0)。 Llp
是整個矩陣。
我想根據每個點的x和y對列表進行升序排序。 我只設法將內部列表排序,但不是整個列表。 有人可以幫我嗎? 謝謝。 這是我的代碼,用於根據y對內部列表(即矩陣的第一行)進行排序。
private void ord_horiz (List<Point> tab)
{
boolean ordered_horiz = false;
int size = tab.size();
while(!ordered_horiz)
{
ordered_horiz = true;
for(int i=0 ; i < size-1 ; i++)
{
if(tab.get(i).y > tab.get(i+1).y)
{
swap(tab, i, i+1);
ordered_horiz = false;
}
}
size--;
}
}
private void swap(List<Point> tab, int ind1, int ind2)
{
Point c;
c = tab.get(ind1);
tab.set(ind1, tab.get(ind2));
tab.set(ind2, c);
}
這是我到目前為止編寫的代碼:
Collections.sort(tab,new Comparator<List<Point>>(){
@Override
public int compare(List<Point> o1, List<Point> o2) {
if(o1 != null && o2 !=null)
{
Point var1 = o1.get(0);
int var1_x = var1.x;
int var1_y = var1.y;
Point var2 = o2.get(0);
int var2_x = var2.x;
int var2_y = var2.y;
Integer.compare(var1_x, var2_x);
Integer.compare(var1_y, var2_y);
return /* What shall I return ? */;
}
return 0;
}
});
這是我的控制台輸出的屏幕截圖。 我想要對這一點進行排序。 http://imageshack.us/scaled/large/515/38zy.png
“我想根據x和y對外部列表進行排序,因為x是Llp中lp的順序,y是Llp中每個lp元素的順序。”
您應該使用自定義比較器。 由於我假設LLP中的每個列表具有相同數量的元素,並且每個列表僅用於不同的X,因此以下應該起作用:
//Create the Data
List<List<Point>> Llp = new ArrayList<List<Point>>();
for(int i=0; i< 50; i++)
{
List<Point> lp = new ArrayList<Point>();
for(int j=0; j<50; j++)
lp.add(new Point((int)(Math.random()*1000), i));
Llp.add(lp);
}
// The comparators
Comparator<List<Point>> comparator_rows = new Comparator<List<Point>>() {
@Override
public int compare(List<Point> o1, List<Point> o2) {
int i = o2.get(0).y;
int j = o1.get(0).y;
if (i < j) {
return 1;
} else if (i > j) {
return -1;
} else {
return 0;
}
}
};
Comparator<Point> comparator_columns = new Comparator<Point>() {
@Override
public int compare(Point o1, Point o2) {
int i = o2.x;
int j = o1.x;
if (i < j) {
return 1;
} else if (i > j) {
return -1;
} else {
return 0;
}
}
};
// Sort the rows
Collections.sort(Llp, comparator_rows);
// Sort the columns
for (List<Point> element : Llp)
Collections.sort(element, comparator_columns);
//Print the elements
int rowIndex = 0, columnIndex=0;
for (List<Point> row : Llp)
{
for (Point element : row)
System.out.print("("+element.x+ "," + element.y +")|");
System.out.println();
}
上面的代碼獲取每行的第一個元素,並提取X坐標。 然后,此x坐標用於對所有行進行排序。
如果您的數據全部混淆,您可以使用以下使用TreeMaps的代碼將元素放在它們應該的位置。 結果是鋸齒狀陣列。
//Create the Data
List<List<Point>> Llp = new ArrayList<List<Point>>();
for(int i=0; i< 50; i++)
{
List<Point> lp = new ArrayList<Point>();
for(int j=0; j<50; j++)
lp.add(new Point((int)(Math.random()*1000), (int)(Math.random()*1000)));
Llp.add(lp);
}
//If all data is mixed up we need to filter into new rows based on X using a TreeMap
TreeMap<Integer, TreeMap<Integer,Point>> data = new TreeMap<Integer,TreeMap<Integer,Point>>();
for (List<Point> row : Llp)
{
for (Point element : row)
{
TreeMap<Integer,Point> rowForX;
if(data.containsKey(element.x))
rowForX = data.get(element.x);
else
data.put(element.x, rowForX = new TreeMap<Integer,Point>());
//Create specific row in TreeMap
rowForX.put(element.y,element);
}
}
//Convert Sorted TreeMap(s) to Lists
Llp.clear();
Iterator<Entry<Integer, TreeMap<Integer, Point>>> it = data.entrySet().iterator();
while(it.hasNext())
Llp.add(new ArrayList<Point>(it.next().getValue().values()));
//Print the elements
int rowIndex = 0, columnIndex=0;
for (List<Point> row : Llp)
{
for (Point element : row)
System.out.print("("+element.x+ "," + element.y +")|");
System.out.println();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.