2016-11-24 3 views
1

하나의 Predicate이 다른 Predicate보다 더 엄격한 지 테스트하기위한 작업을 Java로 표현하는 표준 방법이 있습니까?API를 사용하여 하나의 'Predicate'가 다른 'Predicate'보다 더 엄격한 지 테스트하는 연산을 나타 냅니까?

내가 그러나 나는 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 .

이 유형의 검사는 예를 들어 캐시 된 검색 결과를 다시 사용합니다.

예 :

  1. string.contains("xy") 엄격한보다 string.contains("x")
  2. 입니다

    내가 도움이 될 수있는, isEqual()equals() 참조, 그러나 더 최적화 ... 수

    EDIT있다 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()'메소드 (자바 버전의 경우)는 덜 엄격한 술어의 서브 세트에 대해'true'를 리턴한다고 가정합니다 '사실'로 평가하고, 그 외에는 평가하지 않습니다. –

+0

@ 보헤미안 : 감사합니다. 3 가지 예와 1 개의 반대 예제를 추가했습니다. – KarolDepka

답변

1

설명하는 내용은 graph입니다. 당신이 사용할 수있는 Google 구아바의 술어 엄격 그래프를 정의하고 그것을 쿼리 할 graph API 새로운 : 자세한 내용은

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] 

이 지정된 조건보다 엄격한 조건에 대한 그래프를 조회 고려

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 

더 설명하기 위해 , GraphsExplained · google/guava Wiki을 참조하십시오.

+0

이것은 누군가가 모든 조건을 가진 그래프를 설정할 것을 요구하며 무한한 수의 조건이 있기 때문에 그래프는 많은 메모리를 사용할 것입니다. –

+0

@ ChaiT.Rex "엄격함 검사 방법은 당연히 똑똑하게 구현되어야합니다."(KarolDepka). 단일 코드베이스는 엄격 성을 정의하기 위해 한정된 수의 술어를 가져야합니다. – mfulton26

+0

질문은 표준 라이브러리에서'Predicate' Java 클래스의 두 인스턴스를 취하는'isStricterThan' 메소드에 관한 것입니다.이 클래스는 몇 가지가 아닌 모든 조건자를 허용합니다. 가능한 검색을 몇 가지 예로만 제한하면 캐시 된 검색 결과를 다시 사용하는 예제는 이해가되지 않습니다. 아주 소수의 사람들 만 손으로 ​​입력 한 술어 목록을 검색 할 수있는 검색 엔진을 구현합니다. –