【问题标题】:My output is skipping a few phrases that I inputed我的输出跳过了我输入的一些短语
【发布时间】:2015-09-07 04:33:17
【问题描述】:

我应该输入名称并使用 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);
}

}

【问题讨论】:

  • if (nameInList.compareToIgnoreCase(person) &gt; 0) ... 如果不是,会发生什么?
  • 如果不是,它不会更新索引以检查列表中的下一个单词吗?
  • 如果nameInList person 会发生什么? person 何时被添加到列表中?

标签: java alphabetical


【解决方案1】:

您没有处理您输入的人名小于列表中已经存在的人名的情况:

    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);

【讨论】:

    【解决方案2】:

    类似的东西

    首先将所有元素添加到列表中,直到输入-1。最后是Sort

    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]
    

    【讨论】:

      【解决方案3】:

      让我们考虑一下,下面的输入...

      Jane
      Adam
      Harry
      Potter
      
      • Jane > Adam (9),所以Adam被添加到位置0
      • Harry Adam (-7), 但是 > Jane (2), 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);
      

      现在,由于列表已排序,我们可以使用二进制搜索来查找字符串的建议位置,但这可能有点超出要求;)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-14
        • 2014-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多