2016-04-21 36 views
1

我有以下數組列表,其中包含以下 點標識(1,2,3,4,1,8,5, 6,8,9,7,9)。我使用的Java 7如何在數組列表中每次將數組列表拆分爲子列表

我想知道如何可以拆分成子列表,即低於

(1,2,3,4,1) (8,5,6,8) (子列表9,7,9)

我有問題,試圖用一個循環迴路內(即從每個在內部循環的其他點)的外環檢查每個點 得到
索引位置( starPosIndex和endPosIndex),其中有重複的點ID和ArrayList.sublist(startPosIndex,endPosIndex)以獲得正確的子列表

int startPos = 0; 
int endPos = 0; 
for (int j = 0; j < polygonList3.size(); j++){ 
    Point pointToCheck = polygonList3.get(j); 

    for (int k = 1; k < polygonList3.size(); k++){ 
     Point pointToCheck2 = polygonList3.get(k); 
     if (pointToCheck.getID() == pointToCheck2.getID()){ 
      startPos = startPos + endPos; 
      endPos = endPos + k; 
      //startPos = startPos + endPos; 
      //for (int startPos = j; startPos < polygonList3.size(); startPos = (startPos) + endPos) { 
       //endPos = Math.min(startPos + endPos, polygonList3.size()); 
       finalPolygonLists.add(new ArrayList<Point>(polygonList3.subList(startPos, endPos)));//originalPtsSublist2); 
      //} 
     } 
    } 
+0

告訴我們你到目前爲止試過的東西 –

+0

你使用ArrayList.sublist遇到了什麼樣的問題? – ParkerHalo

+0

列表是否總是由包含副本號碼的唯一號碼組成? I.E.,你想要什麼輸出(1,2,3,2,3)? – Aaron

回答

2

我會解決這個問題的方式如下:

  1. 分配一個HashSet包含唯一值遇到
  2. 分配一個新的列表中第一子列表
  3. 遍歷整個列表,添加每個值的集合。當我們遇到一個已經在集合中的值時,我們完成了第一個子列表,所以清除集合,並分配一個新的子列表。
  4. 迭代後,您將獲得O(n)中獲得的子列表的列表,運行時間
+0

謝謝詹姆斯我會試試看。我在其他一些需要唯一值的方法中使用了LinkedHashSet。我會試試這個。 – daveb

+0

@daveb使用散列法,您可以獲得持續時間爲'.contains'的好處,與根據第一次嘗試將每個值與其他值進行比較相比,這樣可以節省大量時間 –

+0

謝謝James!感謝這個 – daveb

1

您可以沿着列表行走,並隨時創建列表的切片(使用List#subList)。通過始終檢查列表當前段的第一個元素是否出現在列表中的其他位置,可以高效地完成此操作。如果存在,則可以存儲此「切片」,然後繼續使用列表的「尾部」。如果沒有,你完成(和列表的尾部可能會或可能不會是結果的一部分 - 這是給你)

這裏實現作爲一個例子:

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

public class ListSlicing 
{ 
    public static void main(String[] args) 
    { 
     runTest(1,2,3,4,1,8,5,6,8,9,7,9); 
     runTest(1,2,3,4); 
     runTest(1,1,1,1); 
     runTest(1,2,1,2,1,2,1,2,1,2,1,2); 
     runTest(); 
    } 

    private static void runTest(Integer ... numbers) 
    { 
     List<Integer> list = Arrays.asList(numbers); 
     System.out.println("Input: "+list); 
     System.out.println("Output: "+slices(list)); 
    } 

    private static <T> List<List<T>> slices(List<T> input) 
    { 
     List<List<T>> slices = new ArrayList<List<T>>(); 
     List<T> current = input; 
     while (current.size() > 0) 
     { 
      T first = current.get(0); 
      int appearance = current.subList(1, current.size()).indexOf(first); 
      if (appearance == -1) 
      { 
       slices.add(current); 
       return slices; 
      } 
      List<T> slice = current.subList(0, appearance+2); 
      slices.add(slice); 
      current = current.subList(appearance+2, current.size()); 
     } 
     return slices; 
    } 
} 

輸出是

Input: [1, 2, 3, 4, 1, 8, 5, 6, 8, 9, 7, 9] 
Output: [[1, 2, 3, 4, 1], [8, 5, 6, 8], [9, 7, 9]] 
Input: [1, 2, 3, 4] 
Output: [[1, 2, 3, 4]] 
Input: [1, 1, 1, 1] 
Output: [[1, 1], [1, 1]] 
Input: [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2] 
Output: [[1, 2, 1], [2, 1, 2], [1, 2, 1], [2, 1, 2]] 
Input: [] 
Output: [] 
+0

謝謝Marco13。非常感激。我正在學java,所以非常感謝你輸入 – daveb

0

下面的代碼跟蹤的最後位置的每個號碼,一旦它創立一個重複的,它會創建子表,並清除所有先前跟蹤的項目。

List<Integer> list = Arrays.asList(1,2,3,4,1,8,5,6,8,9,7,9); 

List<List<Integer>> sublists = new ArrayList<>(); 
Map<Integer,Integer> lastPos = new HashMap<>(); 

for(int i = 0; i < list.size(); i++) { 
    Integer current = list.get(i); 
    if(lastPos.containsKey(current)){ 
     sublists.add(list.subList(lastPos.get(current), i+1)); 
     lastPos.clear(); 
    } else { 
     lastPos.put(current, i); 
    } 
} 
System.out.println(sublists); 
+0

謝謝Gerald。非常感激 – daveb

相關問題