2009-10-03 89 views
2

我需要通過過道的項目位於例如排序購物列表:
[麪包] [1]
[牛奶] [2]
[穀物] [3]爪哇2D ArrayList和排序

我打算這樣做ArrayList和想知道如何製作一個二維ArrayList 獎金問題:關於如何按過道數進行排序的任何想法?

回答

5

難道你沒有持有你的物品+過道信息的班級嗎?喜歡的東西:

public class Item { 
    private String name; 
    private int aisle; 

    // constructor + getters + setters 
} 

如果你不這樣做,考慮做一個 - 它絕對不是試圖這些屬性粘成ArrayList的另一個的ArrayList中的更好的方法。一旦你有說類,你要麼需要通過自己編寫的對象Comparator或使「項」 Comparable

public class Item implements Comparable<Item> { 
    .. same stuff as above... 

    public int compareTo(Item other) { 
    return this.getAisle() - other.getAisle(); 
    } 
} 

然後你要做的就是那種調用:

List<Item> items = new ArrayList<Item>(); 
... populate the list ... 
Collections.sort(items); 
+0

好吧我會研究這個 – Raptrex 2009-10-03 00:27:19

+0

我是否需要創建多個對象或者什麼,因爲我認爲使用ArrayList的原因是因爲我不知道會有多少物品 – Raptrex 2009-10-03 00:51:49

+0

您必須創建多個物品是,並將它們添加到ArrayList。 'items.add(new Item(「Bread」,1)); items.add(new Item(「Milk」,2));'等等... – ChssPly76 2009-10-03 01:01:11

0

我知道這個問題很久以前就問過了,但實際上我有同樣的問題。如果您不知道列表中有多少變量,但這不是一個大數字,您可以爲每個選項都實施比較器。例如

我有ArrayList<ArrayList<Object>>,並希望通過列的排序,而且我知道,嵌套列表包含的對象數目不定的我就可以實現比較每一個可能的值:

public class SecondColumnComparator implements Comparator { 

public static boolean isNumeric(String str) { 
    try { 
     Integer integer = Integer.parseInt(str); 
    } catch (NumberFormatException nfe) { 
     return false; 
    } 
    return true; 
} 

@Override 
public int compare(Object o1, Object o2) { 

    if (isNumeric(((ArrayList<String>) o1).get(1))) { 

     Integer firstInteger = Integer.parseInt(((ArrayList<String>) o1).get(1)); 
     Integer secondInteger = Integer.parseInt(((ArrayList<String>) o2).get(1)); 

     return firstInteger.compareTo(secondInteger); 

    } 
    if (((ArrayList<Object>) o1).get(1) instanceof String) { 

     String firstString = ((ArrayList<String>) o1).get(1); 
     String secondString = ((ArrayList<String>) o2).get(1); 

     return firstString.compareTo(secondString); 
    } 

    throw new Exception(); 
} 

}

並稱之爲是這樣的:

 switch (valueSelected) { 
     case 0: 
      Collections.sort(this.listOfLists, new FirstColumnComparator()); 
      break; 
     case 1: 
      Collections.sort(this.listOfLists, new SecondColumnComparator()); 
      break; 
     case 2: 
      Collections.sort(this.listOfLists, new ThirdColumnComparator()); 
      break; 
     case 3: 
      Collections.sort(this.listOfLists, new FourthColumnComparator()); 
      break; 
     default: 

    } 

在每一個比較只是修改.get(x)其中x是collumn數由你想排序。

可能會使用boolean isNumeric(String str);函數,因爲您不能在一個列表中存儲不同類型的對象,所以我將這個識別放到比較器中,並將String解析爲任何其他類型。

請記住,這個comparator及其「計算」被稱爲每一個算法的比較,所以它是非常低效的...... 儘管這樣的事實,這是一種溶劑。