2017-08-01 80 views
1

這裏是我的問題: 我有一個整數列表:7,0,2
如果我排序使用Collections.sort(list)結果列表是:0,2,7 但我想排序排除列表排序過程中的0,因此輸出如下所示:2,0,7
可能嗎?
在此先感謝。的Java排序整數列表排除特定值

編輯:我忘了提我的3種可能的情況: 1)名單隻包含一個「0」,兩個數字 2)列表包含兩個「0」和一個數字 3)列表包含三個「0 「沒有數字

+0

你只想排除所有0嗎? 7,18,0,9,1,0會發生什麼? – jeanr

+1

只有一個建議,因爲沒有太多的代碼需要更正:使用'Collections.sort(List,Comparator)'和'Comparator'來考慮'0'等於一切,否則就表現'正常'。由於'Collections.sort'保證爲* stable *,因此不應該移動任何'0'。 – Izruo

+2

@lzruo它不依賴於排序算法嗎?穩定僅意味着兩個*相等的項目*與預先排序的順序相同,通常項目不會移動。 –

回答

9

您可以在0 Integer是做,但不僅與Collections.sort()

  1. 檢索和存儲在一個變量指標:
  2. 從列表中刪除機智的0 h List.remove(int)其中int是索引。
  3. 對列表進行排序Collections.sort()
  4. 在列表中存儲的索引處添加0

在代碼中,它提供了:問題編輯後

List<Integer> list = ...; 
int indexOf = list.indexOf(Integer.valueOf(0)); 
list.remove(indexOf); 
Collections.sort(list); 
list.add(indexOf, Integer.valueOf(0)); 

更新處理的情況下,在該列表中有多個0

我更新了,因爲這個案件處理起來有點複雜。
由於它刪除了多個元素,索引不再是原始大小的索引。

public static void main(String[] args) { 
    List<Integer> list = new ArrayList<>(); 
    list.add(7); 
    list.add(0); 
    list.add(2); 
    list.add(9); 
    list.add(0); 
    list.add(1); 
    list.add(0); 
    list.add(4); 

    Set<Integer> indexesOf = new HashSet<>(); 
    int indexOf = -1; 
    int shift = 0; 
    while ((indexOf = list.indexOf(Integer.valueOf(0))) != -1) { 
     indexesOf.add(indexOf + shift++); 
     list.remove(indexOf); 
    } 

    Collections.sort(list); 
    indexesOf.stream().forEach(index -> list.add(index, Integer.valueOf(0))); 
    System.out.println(list); 
} 

輸出:

[1,0,2,4,0,7,0,9]

+1

當然。更好的+125比+25 ;-) – GhostCat

1

冒泡排序這是你的朋友!

public static void main(String[] args) { 
    List<Integer> list = Arrays.asList(7, 0, 2); 
    for (int i = 0; i < list.size() - 1; i++) { 
     int a = list.get(i);    
     for (int j = i + 1; a != 0 && j < list.size(); j++) { 
      int b = list.get(j); 
      if (b != 0 && b < a){ 
       list.set(i, b); 
       list.set(j, a); 
       a = b; // EDITED 
      } 
     }  
    } 
    System.out.println(list); 
} 
+0

我已經寫了一個單元測試你的排序,它似乎並沒有在較大的列表和多個0的工作。 – skubski

+0

@skubski拜託,你能分享你的單元測試嗎? pastebin或任何你想要的東西 –

+1

OP重新表達了他的問題,並將其置於評論中。它現在似乎被刪除。包含兩個零的較大列表的單元測試失敗,請參見[pastebin](https://pastebin.com/JCcnrxms)。 – skubski