2016-11-18 6 views
4

Итак, идея состоит в том, чтобы получить вход, который является String (имя для конкретного), а затем сохранить его в Array с размером 26 в соответствующую ячейку. Сортировка идет следующим образом: имена, начинающиеся с «A», поступают в ячейку 0, имена, начинающиеся с «B», переходят в ячейку 1 и так далее. Теперь ячейка содержит LinkedList, где имена сортируются в алфавитном порядке.Сортировка имен и их хранение в ячейке массива с LinkedList

До сих пор подход, который я сделал, заключается в использовании корпуса коммутатора.

private void addDataAList(AuthorList[] aL, String iN) { 
    char nD = Character.toUpperCase(iN.charAt(0)); 
     switch(nD){ 
      case 'A': 
       AuthorList[0] = iN; 
      break; 

      case 'B': 
       AuthorList[1] = iN; 
      break; 
      //and so on 
     } 
}//addData 

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

+5

Есть вы попробовали 'AuthorList [nD - 'A] = iN;'? – OldCurmudgeon

+0

@OldCurmudgeon нет, и спасибо. Я даже не знал, что ты сможешь это сделать. – Helquin

+0

Но вам нужно как-то защитить от ArrayOutOfBoundException. Например, поймать его и выбросить новое IllegalArgumentException с соответствующим сообщением о требовании первой буквы капитала. Также полезно использовать iN.trim(). –

ответ

1

Предполагая, что класс AuthorList может выглядеть следующим образом:

private class AuthorList{ 
    private LinkedList<String> nameList; 

    public AuthorList() { 
    } 

    public AuthorList(LinkedList<String> nameList) { 
     this.nameList = nameList; 
    } 

    public LinkedList<String> getNameList() { 
     return nameList; 
    } 

    public void setNameList(LinkedList<String> nameList) { 
     this.nameList = nameList; 
    } 

    @Override 
    public String toString() { 
     final StringBuilder sb = new StringBuilder("AuthorList{"); 
     sb.append("nameList=").append(nameList); 
     sb.append('}'); 
     return sb.toString(); 
    } 
} 

я хотел бы сделать это следующим образом:

private static void addDataAList(AuthorList[] aL, String iN) { 
    int index = Character.toUpperCase(iN.trim().charAt(0)) - 'A'; 
    try { 
     AuthorList tmpAuthorList = aL[index]; 
     if(tmpAuthorList == null) aL[index] = tmpAuthorList = new AuthorList(new LinkedList<>()); 
     if(tmpAuthorList.getNameList() == null) tmpAuthorList.setNameList(new LinkedList<>()); 
     tmpAuthorList.getNameList().add(iN); 
    } catch (ArrayIndexOutOfBoundsException aioobe){ 
     throw new IllegalArgumentException("Name should start with character A - Z"); 
    } 
} 

И дополнительный основной метод для тестирования целей:

public static void main (String[] args){ 
    AuthorList[] aL = new AuthorList[26]; 
    addDataAList(aL, " dudeman"); 
    for (AuthorList list : aL) System.out.println(list); 
} 
+0

Список не является общим iirc или должен быть ArrayList? в любом случае, я попытаюсь смоделировать свой код с вашим и посмотреть, работает ли он, прежде чем я смогу принять это в качестве ответа. – Helquin

+0

Я не был уверен, что такое AuthorList и как добавить в него данные, но я уверен, что привязка String к AuthorList [x] с помощью «=» завершится неудачно, поэтому я изменил его, чтобы он работал правильно для целей тестирования. Конечно, вы должны соответствовать этому решению в соответствии с вашими потребностями классом AuthorList. –