2015-09-07 54 views
1

我應該接受名稱的輸入並使用compareTo函數按順序輸出它。但是當我輸入很多字符串時它會跳過單詞。有人知道爲什麼我的輸出跳過了我輸入的幾個短語

ArrayList<String> names = new ArrayList<String>(); 
    System.out.println("Enter the names and designate the end with a -1:"); 
    Scanner in = new Scanner(System.in); 
    String person = in.next(); 

    if (names.isEmpty()) 
    { 
     names.add(person); 
     person = in.next(); 
    } 

    while (!person.equals("-1")) 
    { 
     for (int i = 0; i < names.size(); i++) 
     { 
      String nameInList = names.get(i); 
      if (nameInList.compareToIgnoreCase(person) > 0) 
      { 
       names.add(i, person); 
       break; 
      } 
     } 
     person = in.next(); 
    } 
    System.out.println(names); 
} 

} 
+0

'如果(nameInList.compareToIgnoreCase(人)> 0)'......當不是時會發生什麼? – MadProgrammer

+0

如果不是它不更新已經檢查列表中的下一個單詞的索引? – Chuck

+0

如果'nameInList' <<'person'會發生什麼?什麼時候「人」被添加到列表中? – MadProgrammer

回答

0

你面對的不是,你輸入的人名比名字更小的已經存在於你的列表中的情況:

boolean found = false; 
    for (int i = 0; i < names.size(); i++) 
    { 
     String nameInList = names.get(i); 
     if (nameInList.compareToIgnoreCase(person) > 0) 
     { 
      names.add(i, person); 
      found = true; 
      break; 
     } 
    } 
    if(!found) names.add(person); 
0

這樣

東西添加所有元素列表首先輸入-1Sort結束。

public static void main(String[] args) { 
     ArrayList<String> names = new ArrayList<String>(); 
     String person = ""; 
     System.out.println("Enter the names and designate the end with a -1:"); 
     Scanner in = new Scanner(System.in); 

     while (in.hasNext()) { 
      person = in.next(); 
      if(!person.equals("-1")){ 
       names.add(person); 
      }else{ 
       break; 
      } 
     } 

     Collections.sort(names, new Comparator<String>() { 
      @Override 
      public int compare(String s1, String s2) { 
       return s1.compareToIgnoreCase(s2); 
      } 
     }); 

     System.out.println(names); 
    } 

輸出

Enter the names and designate the end with a -1: 
ankur 
singhal 
-1 
[ankur, singhal] 
0

讓我們考慮了一下,下面的輸入...

Jane 
Adam 
Harry 
Potter 
  • Jane>Adam9),所以Adam是在加位置0
  • Harry < Adam-7),但>Jane2),Harry加入到位置1
  • Admin < Potter-15),< Harry-8),< Jane-6),並且因此被完全忽略,並且從不添加到列表中

所以我們的最終列表看起來像......

[Adam, Harry, Jane] 

讓我們修改代碼咯,到更多的東西一樣......

ArrayList<String> names = new ArrayList<String>(); 
System.out.println("Enter the names and designate the end with a -1:"); 

Scanner in = new Scanner(System.in); 
String person = "-1"; 
do { 
    person = in.nextLine(); 
    if (!person.equals("-1")) { 
     int i = 0; 
     for (; i < names.size(); i++) { 
      String nameInList = names.get(i); 
      System.out.println(" > " + nameInList + " = " + nameInList.compareToIgnoreCase(person)); 
      if (nameInList.compareToIgnoreCase(person) > 0) { 
       break; 
      } 
     } 
     System.out.println("Added @ " + i); 
     names.add(i, person); 
    } 
} while (!person.equals("-1")); 
System.out.println(names); 

以相同的輸入,我們得到

[Adam, Harry, Jane, Potter] 

作爲輸出。

這是因爲我們設置了for-loop以找到給定名稱的最佳位置。如果在任何階段nameInList>person,則循環會中斷,我們使用當前值i作爲插入點,否則,i將成爲列表中的下一個位置(這是add方法的一個不錯的副作用)

現在
int i = 0; 
for (; i < names.size(); i++) { 
    String nameInList = names.get(i); 
    System.out.println(" > " + nameInList + " = " + nameInList.compareToIgnoreCase(person)); 
    if (nameInList.compareToIgnoreCase(person) > 0) { 
     break; 
    } 
} 
System.out.println("Added @ " + i); 
// Every body is added in the end! 
names.add(i, person); 

,因爲列表進行排序,我們可以使用二進制搜索找到該字符串的擬置入,但可能是有點超出要求;)

相關問題