2016-06-03 4 views
-4

나는 Comparable<T> 인터페이스에 대해 배울 수있는 엑서사이즈를 해결하려고합니다. 문자열 배열에서 가장 짧은 문자열과 가장 긴 문자열을 찾는다.배열의 최단/최장 문자열을 찾는 CompareTo()

나는 String.compareTo() 메서드가 알파벳 순으로 정렬되기 때문에 내 자신을 compareTo() -method로 만들어야한다고 생각합니다. 하지만 내 방법이 어떻게 생겼는지는 알 수 없습니다.

이 지금까지 내 코드입니다 : 당신이 언급 한 바와 같이

class ComparableTest implements Comparable<String> { 

    public static void main(String[] args) { 
     String arr[] = {"hei", "hvordan", "gaar", "det", "med", "deg", "a"}; 
     String tempSto = arr[0]; //long string 
     String tempLit = arr[0]; //short string 
     for(String e : arr) { 
      if(e.compareTo(tempSto) > 0) { 
       tempSto = e; 
      } 
      if(e.compareTo(tempLit) < 0) { 
       tempLit = e; 
      } 
     } 
     System.out.println("Longest string is: " + tempSto); 
     System.out.println("Shortest string is: " + tempLit); 
    } 
} 
+0

경우'같은 (e.length()> tempSto 길이()) ...'당신이 – vikingsteve

+0

@Magnarok 도움이 될 수도, 당신은 두 문자열을 비교하는 길이 방법을 사용하는 가정된다 권리?? – VSK

+0

비교 된 두 문자열 사이의 길이 차이를 기반으로 정수를 반환하는 compareTo() 메서드를 생성해야합니다. – Magnarok

답변

3

, 당신은 구현해야 자신의 문자열의 길이,하지의 알파벳 내용에 따라 Comparator. 예 :

public class StringLengthComaprator extends Comaprator<String> { 
    @Override 
    public int compare (String s1, String s2) { 
     return Integer.compare(s1.length(), s2.length(); 
    } 
} 

당신이 그 일을하면, 당신은 당신을 위해 무거운 작업을 수행 할 배열의 짧은 문자열을 찾기 위해 그것을 사용하거나 Collections#min(Collection, Comparator)을 다시 사용할 수 있습니다 :

String shortest = 
    Collections.min(Arrays.asList(arr), new StringLengthComaprator()); 
+0

두 개의 매개 변수를 사용하는 것이 좋습니다. compareTo() - 메서드에는 하나의 매개 변수 만 있다고 생각했습니다. – Magnarok

+0

사실, 왜 'Comparable'을 구현하는 대신에'Comparator'를 확장하고 있습니까? – dingalapadum

+0

@Magnarok'Comparable # compareTo'는 메소드를 호출하는 객체와 비교할 때 하나의 인자를 가지고 있습니다. 'String' 코드를 재 작성할 수 없기 때문에 외부 Comparator가 필요합니다. – Mureinik

0

을 경우 클래스는 Comparable 인터페이스를 구현합니다. compareTo 메소드를 재정의하고 비교 된 두 String의 길이를 비교해야합니다.

+0

인터페이스가 구현을 제공하지 않습니다. compareTo를 "오버라이드"할 필요는 없습니다. 당신은 그것을 구현해야합니다. – dingalapadum

+0

오버라이드가 필요할 수도있는 인터페이스에 기본 메소드를 가질 수 있으며 구현되지 않은 메소드를 구현해야 할 때 대부분의 IDE가 @Override 주석을 넣습니다. 그렇습니다. ok –

+0

맞습니다 - java 8에는 인터페이스의 기본 메소드가 있기 때문에 ... 그걸 몰랐어 .... – dingalapadum

0

비교할 수있는 목록을 사용하여 필요에 따라 목록을 정렬 할 수 있습니다. 이는 문자열에서 문자열의 최고 수와 최저 수가 비교와 관련이 있음을 의미합니다. 따라서 비교 함수에서 서로의 값을 뺍니다. 예를 들어 housedog 인 경우 두 값은 5와 3입니다. 서로 값을 빼면 값의 근접 정도가 달라집니다. 따라서 주문 함수에서 두 매개 변수 길이의 차이를 반환하십시오. 목록의 첫 번째 요소와 마지막 요소는 가장 큰 단어와 가장 작은 단어가됩니다 (어떤 값을 빼는가에 따라 다릅니다). 자바 (8)

0

:

import java.util.Arrays; 

public class Example { 

    public static void main(String[] args) { 

     String arr[] = {"hei", "hvordan", "gaar", "det", "med", "deg", "a"}; 

     String minLengthStr = Arrays.stream(arr) 
            .min((str1, str2) -> Integer.compare(str1.length(), str2.length())) 
            .get(); 

     String maxLengthStr = Arrays.stream(arr) 
            .max((str1, str2) -> Integer.compare(str1.length(), str2.length())) 
            .get(); 

     System.out.println("Longest string is: " + maxLengthStr); 
     System.out.println("Shortest string is: " + minLengthStr); 
    } 
} 

출력 :

설명
Longest string is: hvordan 
Shortest string is: a 

:

스트림 클래스의 분 방법은, 파라미터로서 비교기 걸린다. Comparator는 함수 인터페이스이므로 람다 식을 구현하기위한 짧은 손으로 사용할 수 있습니다.

그래서 대신 쓰기 :

Comparator<String> lengthComparator = new Comparator<String>() { 
    @Override 
    public int compare(String str1, String str2) { 
     return Integer.compare(str1.length(), str2.length()); 
    } 
}; 

당신은 쓸 수 있습니다 :

Comparator<String> lengthComparator = (str1, str2) -> Integer.compare(str1.length(), str2.length()); 

너무 스트림없이 사용할 수 있습니다 :

나는 희망
public class Example { 

    public static void main(String[] args) { 

     String arr[] = {"hei", "hvordan", "gaar", "det", "med", "deg", "a"}; 

     String minLengthStr = arr[0], maxLengthStr = arr[0]; 

     Comparator<String> lengthComparator = (str1, str2) -> Integer.compare(str1.length(), str2.length()); 

     for(String str : arr) { 
      if(lengthComparator.compare(str, minLengthStr) == -1) { 
       minLengthStr = str; 
      } else if(lengthComparator.compare(str, maxLengthStr) == 1) { 
       maxLengthStr = str; 
      } 
     } 

     System.out.println("Longest string is: " + maxLengthStr); 
     System.out.println("Shortest string is: " + minLengthStr); 
    } 
} 
0

,이

도움이 될 것입니다
public class Test implements Comparator<String>{ 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     //String arr[] = {"hei", "hvordan", "gaar", "det", "med", "deg", "a"}; 

     Set<String> set = new TreeSet<String>(new Test()); 
     set.add("hei"); 
     set.add("hvordan"); 
     set.add("gaar"); 
     set.add("med"); 
     set.add("deg"); 
     set.add("a"); 

     System.out.println(set); 
    } 

    @Override 
    public int compare(String o1, String o2) { 
     // TODO Auto-generated method stub 
     if(o1.length()>o2.length()) 
      return 1; 
     else if(o1.length()<o2.length()) 
      return -1; 
     else 
      return 0; 

    } 
0

String으로 게임을하고 싶다면 여기 ComparablecompareTo을 예로들 수 있습니다.

ideone.com

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

public class Test { 
    String arr[] = {"hei", "hvordan", "gaar", "det", "med", "deg", "a"}; 

    /** 
    * Use composition. 
    */ 
    class MyComparableString implements Comparable<MyComparableString> { 
     String myString; 

     MyComparableString(String s) { 
      myString = s; 
     } 

     @Override 
     public int compareTo(MyComparableString other) { 
      // Compare the lengths of the strings in this and other. 
      Integer l1 = myString.length(); 
      Integer l2 = other.myString.length(); 
      return l1.compareTo(l2); 
     } 

     // String representation. 
     public String toString() { 
      return myString; 
     } 
    } 

    void go() { 
     // Convert the String array into a List (Collection) of MyComparableString. 
     List<MyComparableString> l = new ArrayList<>(); 
     for (String s: arr) { 
      l.add(new MyComparableString(s)); 
     } 
     // Print longest and shortest. 
     System.out.println("Shortest: " + Collections.min(l)); 
     System.out.println("Longest: " + Collections.max(l)); 
    } 

    public static void main(String[] args) { 
     new Test().go(); 
    } 
}