2017-10-27 11 views
-2

BiPredicate를 나타 내기 위해 다음 람다를 만들었습니다.Java 문자열에 양면이 있습니다.

(s1, s2) -> s1.getArtist().contains(s2.getArtist()) || s2.getArtist().contains(s1.getArtist()) 

이제는 메소드 호출이나 다른 것을 사용하여 더 간결하게 만들 수있는 방법이 있는지 궁금합니다. 여분의 변수를 생성하지 않고 원 라이너로 유지하는 것을 선호하지만, 이해가된다면 다른 솔루션을 위해 아직 열어두고 있습니다.

+1

여기서 개선 할 필요는 없습니다. – notyou

+2

개선 사항을 원하면 어떻게해야합니까? 물론 문자열 중 하나에 다른 문자열이 들어 있는지 확인하고 그 외에 호출하는 메서드를 제공하거나 사용할 수 있습니까? 메소드를 작성하는 방법에 대한 힌트 : 처음에는 그 문자열 중 더 긴 문자열을 확인한 다음 다른 방법으로는 사용할 수 없으므로'longer.contains (short) '를 확인하십시오. 둘 다 길이가 같으면 그냥 선택하십시오. 하나는 "길다". _ 긴 _ 아티스트 이름이 없으면이 차이가별로 없을 것입니다. – Thomas

답변

0

자바 빠른 메서드가 이미 길이를 검사하기 때문에 테스트 할 특수 문자열을 선택했습니다. 문자열의 길이가 다른 경우 (기본적으로 contains은 하나만 잘라집니다. 첫 번째 인수의 길이가 더 짧은 지 확인한 직후). 또한 contains 단축키 이후로 더 이상 참이 될 수 없다는 것을 알게되었으므로, 끝 부분 만 다를뿐입니다. 둘 다 정말로 긴 문자열입니다. 실제 세계에서 이러한 문자열을 만날 가능성은 없습니다.

이 접근법은 전체 검사를 두 번하고 한 번만하지만 차이는 무시할 수 있기 때문에 2 배 빠릅니다. 실제 벤치 마크에서는 훨씬 더 작습니다. 그리고 문자열은 그 차이가 최대 가능하기 때문에 뽑혔다. 그래서 ...

결론적으로 그것은 원하는대로 좋지만 실제로 나에게이 버전은 더 깨끗해진다.

public static void main(String[] args) { 
    String a = ""; 
    String b = ""; 

    Random random = new Random(); 
    StringBuilder builder = new StringBuilder(119999999); 

    for(long i = 0; i < 119999999; i++) 
    builder.append((char) random.nextInt()); 

    a = builder.toString() + "zzzzzzzzz"; 
    b = a.substring(0, a.length() - 9) + "dsadsasda"; 

    Instant start = Instant.now(); 

    boolean test = a.length() > b.length() ? a.contains(b) : b.contains(a); 
    //boolean test = a.contains(b) || b.contains(a); 

    if(test) 
    System.out.println("OK"); 

    System.out.println(Duration.between(start, Instant.now()).toMillis()); 
}