2011-12-26 6 views
7

При попытке отсортировать массив на основе его длины строки элемента, я поражен ошибкой компиляции. У меня есть набор, чтобы начать с,,Сортировка строк длиной с использованием компаратора

Set<String> arraycat = new HashSet<String>(); 
//add contents to arraycat 
String[] array = arraycat.toArray(new String[0]); 
//array looks like this now: 
//array=[cat,cataaaa,cataa,cata,cataaa] 

Я бы идеально хотите сортируется

array=[cat,cata,cataa,cataaa,cataaaa] 

поэтому у меня есть компаратор типа

class comp implements Comparator { 

    public int compare(String o1, String o2) { 
     if (o1.length() > o2.length()) { 
      return 1; 
     } else if (o1.length() < o2.length()) { 
      return -1; 
     } else { 
      return 0; 
     } 
    } 
} 

, а затем я называю класс от

Collections.sort(array, new comp()); 

, но затем, что у меня две ошибки компиляции:

comp is not abstract and does not override abstract method compare(java.lang.Object,java.lang.Object) in java.util.Comparator 
class comp implements Comparator { 
^ 
testa.java:59: cannot find symbol 
symbol : method sort(java.lang.String[],comp) 
location: class java.util.Collections 
Collections.sort(array, new comp()); 
^2 errors 

Я был бы признателен за любые ключи, необходимые для решения проблемы.

ответ

13

Вы должны указать параметр типа для Comparator для вашего осуществление для работы.

class comp implements Comparator<String> { 
    public int compare(String o1, String o2) { 
    if (o1.length() > o2.length()) { 
     return 1; 
    } else if (o1.length() < o2.length()) { 
     return -1; 
    } else { 
     return 0; 
    } 
    } 
} 

В Java 1.7 и более поздних версиях можно также упростить тело этого метода:

class comp implements Comparator<String> { 
    public int compare(String o1, String o2) { 
    return Integer.compare(o1.length(), o2.length()); 
    } 
} 

Кроме того, Collections.sort сортирует List объектов. Так как вы сортировки массива, вы должны использовать Arrays.sort:

Arrays.sort(array, new comp()); 
+0

Hi Lawrence .. спасибо за это .. Это решило первую ошибку компиляции: но у Ive все еще есть другая ошибка компиляции: «не могу найти символ symbol: method sort (java.lang.String [], comp) местоположение: класс java.util.Collections \t \t Коллекции.sort (array, new comp()); «Я импортировал пакет util *, не уверен, почему я получаю эту ошибку – JohnJ

+1

[' sort() '] (http://docs.oracle.com/javase/6/ docs/api/java/util/Collections.html # sort (java.util.List)) принимает массив 'List', а не' String [] '. Используйте [' Arrays.asList() '] (http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList(T ...)), чтобы преобразовать его. –

+0

Кроме того, для более простого компаратора рассмотрим использование ['Integer.signum (int) '] (http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html#signum (int)) вместо' if/else-if/else'; например, 'return Integer.signum (o1.length() - o2.length());' –

2

Должно быть

class comp implements Comparator<String> { ... 

или даже лучше

Collections.sort(array, new Comparator<String> { ... 

(и даже не называют класс, который используется только один раз)

+0

Прошу прощения, но разве это не то, что у меня есть в коде? – JohnJ

+0

Вам нужно указать переменную типа! Компаратор * * – Malvolio

6

Вы должны использовать Arrays.sort() метод, если источником данных является array.

Например,

String []array={"first","second","third","six"}; 

Arrays.sort(array,new Comparator<String>() 
{ 
    public int compare(String s1,String s2) 
    { 
    return s1.length() - s2.length(); 
    } 
}); 

Или преобразовать массив в список использовать Collections.sort() метод,

Collections.sort(Arrays.asList(array),new Comparator<String>() 
{ 
    public int compare(String s1,String s2) 
    { 
    return s1.length() - s2.length(); 
    } 
}); 
0

У меня был подобный назначение недавно и я предоставить вам дополнительные пример.

import java.util.Arrays; 
import java.util.Comparator; 
//for more information: http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html 

/** 
* 
* @author Xilef 
*/ 
public class StringKorter implements Comparator<String> { 
    @Override 
    public int compare(String s1, String s2){ 
     if (s1.length() > s2.length()) 
     return 1; 
     else if (s1.length() < s2.length()) 
     return -1; 
     else return 0; 
    } 
    public static void main(String[] args) { 
     String[] woorden = { "boot", "kinderen", "stoel", "volwassenen", "ei", "stoel", "kop", "zeshoek", "stoel", "ei" }; 
     System.out.println("woorden: " + Arrays.toString(woorden));//before sorting by length 
     Arrays.sort(woorden, new StringKorter()); 
     System.out.println("Array woorden after sorting by length: " + Arrays.toString(woorden)); 
    } 
} 
Смежные вопросы