2015-07-28 4 views
-2

У меня есть массив строк, который похож на:Наиболее эффективный способ применить пользовательский порядок сортировки для массива

[module-src1, module-src2, module-src3, ..., source1, source2, source3, ...] 

Я хочу, чтобы изменить порядок этого массива быть:

[source1, source2, source3, ..., module-src1, module-src2, module-src3, ...] 

Что бы самый эффективный способ сделать это на Java?

Я думал о наличии двух очередей для хранения каждого, но это кажется слишком сложным, и я надеюсь увидеть, есть ли более эффективный способ сделать это.

+0

Как вы определяете эффективность? порядок или ваше время? –

+4

что-то с помощью массивов. Сорт и компараторы – zzxx53

+0

@ La-comadreja возможно наименьшее возможное количество линий? – tom

ответ

1

Лучший способом я могу думать, делать это путем иметь свой собственный класс, как

public class Source implements Comparable<Source> { 
    private String name; 
    public Source(String name){ 
     this.name = name; 
    } 

    public String getName(){ 
     return name; 
    } 

    @Override 
    public String toString(){ 
     return name; 
    } 

    @Override 
    public int compareTo(Source another) { 
     //do whatever sorting you want here 
     //for example: 
     if(name.subString(0,5).equalsIgnoreCase("module") && 
       another.getName().subString(0,5).equalsIgnoreCase("module"){ 
      //both start with module, so alphabetize 
      return name.compareTo(another.getName()); 
     } else if(name.subString(0,5).equalsIgnoreCase("module") && 
       !another.getName().subString(0,5).equalsIgnoreCase("module"){ 
      //only this one starts with "module", the other one comes first 
      return -1; 
     } 
     ... 
    } 
} 

надеюсь, вы получите суть с этим.

После того как вы все эти объекты в ArrayList или что-то, просто сделать Collections.sort(myArray) и он должен отсортировать его в порядке, вы хотите

0

Вы должны сделать некоторые предположения о вашем входе (то есть, вы должны предположить, что все строки в вашем массиве форматируются либо «module -», либо «source» -prefixed). Если это так, то вы могли бы сделать что-то вроде этого:

public static void main(String[] args){ 
    String[] strings = new String[]{"module-src1","module-src2", 
      "module-src3","source1","source2","source3"}; 
    Arrays.sort(strings,new ModSrcComparator()); 
    for(String s : strings) System.out.print(s+" "); 
    System.out.println(); 
} 

private static class ModSrcComparator implements Comparator<String>{ 
    @Override 
    public int compare(String s1, String s2) { 
     if(!s1.contains("-") && s2.contains("-")) return -1; 
     else if(s1.contains("-") && !s2.contains("-")) return 1; 
     return s1.compareTo(s2); 
    } 
} 
+0

Я забыл про 'Comparator' (-‸ლ) – Epicblood

0

Если вы хотите сохранить массив строк с минимальным количеством строк кода:

List<String> myList = new ArrayList<>(Arrays.asList(myArray)) 
Collections.sort(myList); 
myArray = myList.toArray(new String[0]); 

Я предложил бы использовать Список вместо массива, который сводит его к одной строке кода:

Collections.sort(myList); 
+2

Не сортировал бы это Алфавитный порядок? Мой начальный массив уже в алфавитном порядке, мне нужно переместить источники в передние модули, сохраняя алфавитный порядок источников и алфавитный порядок модулей. – tom

+1

Мой плохой. Сначала вам нужно будет ответить на вопрос Эпикблода, чтобы иметь заказ на заказ, а затем сделайте это. Или вы можете использовать Компаратор вместо реализации Comparable ... –

Смежные вопросы