2016-12-20 4 views
4

ソースとして名前のストリームを持つファイルシステムで1番目の空きインデックスを見つける必要があります。Javaストリームを使用して1番目の空きインデックスを見つける

リストを考えてみましょう:[ "NEW2"、 "New4"、 "New0"、 "New1など"、...]これらの 第一未使用のインデックスは3

int index = 0; 
try (IntStream indexes = names.stream() 
    .filter(name -> name.startsWith("New")) 
    .mapToInt(Integer::parseInt) 
    .distinct() 
    .sorted()) 
{ 
    // I was thinking about making possible indexes stream, removing existig ones from try-with-resource block, and getting .min(). 
    IntStream.rangeClosed(0, 10)... // Idk what to do. 
} 

になります私が誰かを求めています私のアイデアのための正しい構文を見つけるのを助け、より良い解決法を提案する。

+4

'Integer :: parseInt'は、接頭辞を最初に取り除かない限り失敗します。 – shmosel

答えて

7

最も効率的な方法は、BitSetに収集することである:ビットは本質的にソートされ、区別される

int first = names.stream() 
    .filter(name -> name.startsWith("New")) 
    .mapToInt(s -> Integer.parseInt(s.substring(3))) 
    .collect(BitSet::new, BitSet::set, BitSet::or).nextClearBit(0); 

留意されたいです。また、常に「無料」のインデックスがあります。 0と最大数の間に隙間がない場合、次の空きは最大+ 1になります。一致する要素がまったくない場合、次の空きはゼロになります。それの楽しみのために

+1

それは本当にとても涼しいです! +1(そしてチェックマークはあなたに行くはずです) – janos

+0

私はワンライナーが大好きです!ありがとう! – Ernio

4

あなたは可能性:

  1. は、それぞれの名前
  2. Storeから数値部分を抽出し、リスト
  3. 最初にの大きさになるまで0から
  4. 反復範囲にわたるセットで使用されるインデックス使用されていないセットのインデックスが利用可能です

たとえば、次のようになります。

List<String> names = Arrays.asList("New2", "New4", "New0", "New1"); 
Set<Integer> taken = names.stream() 
    .map(s -> s.replaceAll("\\D+", "")) 
    .map(Integer::parseInt) 
    .collect(Collectors.toSet()); 
int first = IntStream.range(0, names.size()) 
    .filter(index -> !taken.contains(index)) 
    .findFirst() 
    .orElse(names.size()); 
+1

'collect(toSet())'を使わないのはなぜですか?あるいは、リストに集めてインデックスと値を比較することもできます( '.filter(i - taken.get(i)> i)')。 – shmosel

+1

ありがとう@shmoselは、より良い、更新されたセットに収集します。 – janos

0

、あなたは最大63個のエントリを持っている知っ場合...

private static int firstMissing(List<Long> input) { 
     if (!input.contains(0L)) { 
      return 0; 
     } 

     long firstMissing = Long.lowestOneBit(~input.stream().reduce(1L, (i, j) -> i | 1L << j)); 

     int result = 0; 
     while (firstMissing != 0) { 
      ++result; 
      firstMissing = firstMissing >> 1; 
     } 

     return result - 1; 
    } 

@Holgerがやったことだ(私から+1)が、使用しての余分なペナルティなしBitSet。

関連する問題