2016-11-24 10 views
1

Javaで、Predicateが別のものよりも厳しいかどうかをテストする操作を表現する標準的な方法がありますか?PredicateAPIを使用して、1つの「述語」が他の「述語」よりも厳しいかどうかをテストする操作を表現しますか?

私はしかし、私はAPIの中でそのような事を見ていない、pred1.isStricterThan(pred2)のようなものを想像:https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.htmlhttps://google.github.io/guava/releases/19.0/api/docs/com/google/common/base/Predicate.html

このタイプのチェックは、例えば、キャッシュされた検索結果を再利用する。

私は

EDIT ...しかし、可能なさらなる最適化があり、役に立つことができisEqual()equals()を、以下を参照してください。

例:

  1. string.contains("xy")string.contains("x")
  2. より厳しいですstring.contains("xy") && string.contains("ab")は、ちょうどstring.contains("xy")
  3. より厳しいです
  4. x > 3x > 2
  5. string.contains("abc"より厳しい)厳密チェック方法はもちろん巧みケース・バイ・ケースを実装しなければならないstring.contains("cd")

より厳格ではありません。

EDIT 2 & 3:より厳密な述語は、フィルタリングに使用されるとき、より厳密でないもののサブセットを返す必要があります。

編集4:注:私はの実装を求めていません。むしろ、これらの小切手を標準的な方法で表現するには、APIがあるかどうかを尋ねています。

+3

「厳密」とは*正確にはどういう意味ですか?それを明確かつ正確に定義することができれば、答えが可能です。 – Bohemian

+1

@Bohemian - 厳密な述語の 'test()'メソッド(Java版の場合)は、同じドメイン上で動作する2つの述語に対して、より厳密でない述語のサブセットに対して 'true'を返すと仮定します「真」と評価し、それ以外は何も評価しない。 –

+0

@Bohemian:ありがとう、私は3つの例と1つの反例を追加しました – KarolDepka

答えて

1

説明しているものはgraphです。あなたは述語厳密グラフを定義し、それを照会するには、Googleグアバの新しいgraph APIを使用することができます。

Predicate<String> containsX = string -> string.contains("x"); 
Predicate<String> containsXy = string -> string.contains("xy"); 
Predicate<String> containsXyAndAb = string -> string.contains("xy") 
     && string.contains("ab"); 
Predicate<Integer> greaterThan2 = x -> x > 2; 
Predicate<Integer> greaterThan3 = x -> x > 3; 
Predicate<String> containsAbc = string -> string.contains("abc"); 
Predicate<String> containsCd = string -> string.contains("cd"); 

MutableGraph<Predicate<?>> predicateStrictnessGraph = GraphBuilder.directed().build(); 

predicateStrictnessGraph.addNode(containsX); 
predicateStrictnessGraph.addNode(containsXy); 
predicateStrictnessGraph.addNode(containsXyAndAb); 
predicateStrictnessGraph.addNode(greaterThan3); 
predicateStrictnessGraph.addNode(containsAbc); 
predicateStrictnessGraph.addNode(containsCd); 

predicateStrictnessGraph.putEdge(containsXy, containsX); 
predicateStrictnessGraph.putEdge(containsXyAndAb, containsXy); 
predicateStrictnessGraph.putEdge(greaterThan3, greaterThan2); 

boolean isContainsXyStricterThanContainsX = 
     Graphs.reachableNodes(predicateStrictnessGraph, containsXy) 
       .contains(containsX); 
// result: true 

boolean isContainsXyStricterThanContainsXyAndAb = 
     Graphs.reachableNodes(predicateStrictnessGraph, containsXy) 
       .contains(containsXyAndAb); 
// result: false 

さらに、これは指定された述語より厳しい述語のためのグラフを照会検討し説明するために:

Predicate<String> containsAb = string -> string.contains("ab"); 
predicateStrictnessGraph.addNode(containsAb); 
predicateStrictnessGraph.putEdge(containsAbc, containsAb); 
predicateStrictnessGraph.putEdge(containsXyAndAb, containsAb); 
Set<Predicate<?>> containsAbAndStricterPredicates = 
     Graphs.reachableNodes(Graphs.transpose(predicateStrictnessGraph), containsAb); 
// result: [containsAb, containsAbc, containsXyAndAb] 

詳細について、GraphsExplained · google/guava Wikiを参照してください。

+0

これには、誰かが条件をすべて含んだグラフを設定する必要があり、無限の条件が存在するため、グラフには多くのメモリが使用されます。 –

+0

@ ChaiT.Rex「厳密チェックの方法はもちろん、巧みにケースバイケースで実装する必要があります。」(KarolDepka)単一コードベースは、その厳密さを定義するために、有限数の述部を持たなければならない。 – mfulton26

+0

問題は、標準ライブラリの 'Predicate' Javaクラスの2つのインスタンスを取る' isStricterThan'というメソッドについてです。いくつかの述語だけでなく、すべての述語が可能です。可能な検索をいくつかの例に限定すれば、キャッシュされた検索結果を再利用する例は理にかなっていません。非常に少数の人々が、手入力された述語のリストのみを検索できる検索エンジンを実装している。 –

関連する問題