2017-08-01 113 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