2011-01-18 10 views
0

私はちょうどa similar questionと尋ねましたが、実際には別のものが必要であることがわかりました。その質問には既に2つの答えがあるので、私は自分の質問を編集したくありません。配列内のnull以外の参照を検出する


私は、配列の部分範囲がヌル参照のみが含まれているかどうかを検出します:だから、ここで私が実際に必要なものです。どういうわけか、このように:

public static <T> boolean nullReferencesOnly 
(T[] array, int fromInclusive, int toExclusive) 
{ 
    for (int i = fromInclusive; i < toExclusive; ++i) 
    { 
     if (array[i] != null) return false; 
    } 
    return true; 
} 

は、私はアレイ全体に手動でループを持っていないので、Javaライブラリで、このような方法はありますか?範囲については

+0

(注:メソッドが汎用である必要はありません。) –

+0

@Tom:右、配列の共分散。 Javaの型システムの醜い穴:( – fredoverflow

答えて

7
Collections.frequency(Arrays.asList(array), null) == array.length 

、すでに彼の答えに.subList(from, to)を示唆しているSLaks。

+0

私はまだ分かりやすくするためにヘルパーメソッドを考えていますが、 –

+3

配列全体を繰り返し処理するので '.frequency'を使用しません。早く失敗したいですか? –

+0

@Jochenそれでも、OPはいくつかの「速いトリック」を望んでいましたが、標準的なライブラリではそれ以上のものは提供されていないようです:)しかし、これを考慮して使用することに同意します。 –

1

Guava(http://code.google.com/p/guava-libraries/)のような関数型プログラミングライブラリを使用できます。それが使われているかを確認するために


import com.google.common.base.Predicate; 

public class NotNull implements Predicate 
{ 

    @Override 
    public boolean apply(String arg0) 
    { 
     return arg0 != null; 
    } 

} 

とテストドライバー:あなたはこのような何かを行うことができます。これにより


import static org.junit.Assert.*; 

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

import org.junit.Test; 

import com.google.common.collect.Iterables; 

public class Driver 
{ 
    @Test 
    public void testNotNull() 
    { 
     List l = Arrays.asList(new String[] {null, null, null}); 

     String s = Iterables.find(l, new NotNull(), null); 

     assertNull(s); 
    } 

    @Test 
    public void testNotNull2() 
    { 
     List l = Arrays.asList(new String[] {null, "1", null}); 

     String s = Iterables.find(l, new NotNull(), null); 

     assertNotNull(s); 
    } 
} 

を、あなただけのIterables.findを(呼び出し)、それが何かを見つけることができるかどうかを確認していますnullではありません。何も返さない限り(null)、リストにNULLでないものがないことがわかります。

+0

+1これは興味深いようですが、私の場合は少し残忍です。 – fredoverflow

+0

私は確かにNikitaのアプローチを使用します - それは頻度メソッドの大きな用途です。関数ライブラリはアルゴリズムを抽象化するのに最適ですが、Javaがクロージャをサポートするまで、彼らは不器用な感情を続けます。 – McGlone

0

まあ、ない正確に、効率的な、しかし、あなたは、この例のように、助けるためにセットを使用することができます。

String[] test = {null, null, null, null}; 
    Set<String> set = new HashSet<String>(Arrays.asList(test)); 
    System.out.println(set.size() == 0 || (set.size() == 1 && set.contains(null))); 

この方法で、それがすべてnullの場合、それだけで一つの要素と、その1を持っています要素はnullになります。 範囲が必要な場合はArrays.asList(test)のsubListを使用できます。

効率的ではありませんが、コアJavaライブラリにあるクラスを使用します。

これが役に立ちます。

1

私は、あなたが既に持っているコードを取って、Object[]に配列タイプを変更し、そのメソッドを "ヘルパー"クラスに入れることをお勧めします。

  1. AFAIKでは、標準的なJavaライブラリに直接必要なものはありません。
  2. AFAIK、Apache CommonsやGoogle Collections/Guavaには直接的に必要な方法はありません。
  3. Collection.containsを含むソリューションは、equalsに基づいており、nullをテストするとNPEを返すため、失敗します。
  4. 一般的なfrequencyメソッドを含むソリューションは、nullが見つかった場合に短絡しません。
  5. Predicateオブジェクトを適用するソリューションは高価で、ソリューションよりもコードが多くなります。

あなたのソリューションは、提案されたいずれの方法よりも読みやすく、効率的です。明示的なループを含んでいるという事実は、あなたには関係しません。結局のところ、これはあなたが書いているJavaコードです... FP言語ではありません。別に


- 問題がnull要素(よりむしろ非null要素)の存在を試験することであったならば、一つの代替は、org.springframework.util.Assert.noNullElementsあろう。

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/util/Assert.html#noNullElements(java.lang.Object[])) 

しかし、これはむしろtrueまたはfalseを返すよりも例外をスローし、これはあなたがとにかく例外をスローすることを意図していない限り...それを貧しい溶液を作製する可能性があります。