2016-01-18 32 views
3

我在Java中創建了一個類Data。這是這個簡單的幫助類的源代碼:在Java中切出清單

class Data { 

    private Integer x; 
    private Integer y; 

    Data(Integer x, Integer y) { 
     this.x = x; 
     this.y = y; 
    } 

    protected Integer get_x() { 
     return x; 
    } 

    protected Integer get_y() { 
     return y; 
    } 

} 

之後,我用我的Data類來創建一些List<Data> container。我在add方法的幫助下將我的container中的元素添加到我的列表中,並對其進行排序。最後,我打印出來的輸出:

for(Data data : container){ 
    System.out.println("Print x: " + data.get_x() + ", Print y: " + data.get_y()); 
} 

可能的輸出可能是:

Print x: 1, Print y: 3 
Print x: 1, Print y: 5 
Print x: 1, Print y: 2 
Print x: 1, Print y: 4 
Print x: 1, Print y: 5 
Print x: 1, Print y: 2 
Print x: 1, Print y: 6 
Print x: 1, Print y: 7 
Print x: 2, Print y: 3 
Print x: 2, Print y: 5 
Print x: 2, Print y: 2 
Print x: 2, Print y: 4 
Print x: 2, Print y: 5 
Print x: 2, Print y: 2 
Print x: 2, Print y: 6 
Print x: 2, Print y: 7 
... 

每個唯一x -part的長度是可變的,也是我也不需要知道,有多少x我在我的列表中有不同的值。現在我的問題是:是否有可能創建另一個列表(或修改這一個),其中只有有限的和固定數量的頂部x值列表中,並刪除其他?例如,我只希望每個x值有3個值。輸出應該是這樣的:

Print x: 1, Print y: 3 
Print x: 1, Print y: 5 
Print x: 1, Print y: 2 
Print x: 2, Print y: 3 
Print x: 2, Print y: 5 
Print x: 2, Print y: 2 
+0

任何3值?或具體的? – Tunaki

+0

特定頂級值,從每個x – Guforu

+2

的頂部可以創建一個'Map >'。在這裏你可以檢查'map.get(1)'的大小,其中'1'是你的x值。如果這個值小於'4',那麼你可以添加元素,否則不可以。如果你想獲得所有元素的完整'List',那麼你可以在所有可見的'Lists'中創建一個'List'。 – SomeJavaGuy

回答

5

一種解決方案是存儲List<Data>你在Map<Integer, List<Data>>各有x值。

Map<Integer, List<Data>> map = new HashMap<>(); 
for (Data data : container) { 
    List<Data> value = map.get(data.get_x()); 
    if (value == null) { 
     map.put(data.get_x(), new ArrayList<>(Arrays.asList(data))); 
    } else if (value.size() < 3) { 
     value.add(data); 
    } 
} 

在這段代碼中,我們遍歷所有的數據,以及獲取當前列表當前x數據。如果它爲空,則表示當前沒有值,因此我們添加僅包含當前數據的新列表(將Arrays.asList包裝到新的ArrayList中,因爲它返回固定大小的列表)。否則,如果列表少於3個元素,則添加當前元素。

這將只保留每個x值的前3個元素。


使用Java 8,這個循環可以簡化一點:

Map<Integer, List<Data>> map = new HashMap<>(); 
for (Data data : container) { 
    List<Data> list = map.computeIfAbsent(data.get_x(), k -> new ArrayList<Data>()); 
    if (list.size() < 3) { 
     list.add(data); 
    } 
} 

如果你想擁有的所有值的List(而不是Map),有一個更簡單的方法(使用Java 8):保留一個Map<Integer, Integer>將每個x的值與其出現的次數進行映射:

Map<Integer, Integer> map = new HashMap<>(); 
List<Data> filtered = new ArrayList<>(); 
for (Data data : container) { 
    int count = map.merge(data.get_x(), 1, Integer::sum); 
    if (count < 3) { 
     filtered.add(data); 
    } 
} 

filtered列表將會有想要的結果。在此代碼中map.merge在沒有映射的情況下插入1,否則將1添加到先前的映射中。

+0

非常感謝。是的,我知道Java 8語法並在我的代碼中使用它。 – Guforu