2015-09-07 56 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); 

,因为列表进行排序,我们可以使用二进制搜索找到该字符串的拟置入,但可能是有点超出要求;)