Break语句总是被执行

时间:2015-03-18 10:49:00

标签: java

这可能是一个愚蠢的问题,但我们是初学者,我没有找到问题的答案,所以这里是:我们正在开发一个文件系统(小型)我们有这个方法应该将文件从一个目录移动到另一个目录。 (从一个文件或目录中删除文件或目录,然后添加到另一个文件或目录。)

我们使用ArrayLists来存储Items(Item是目录和文件的超类)。

由于所有内容都必须按字母顺序排序,因此移动方法包含一个while循环以验证项目必须放置的位置(没有目录或文件的首选项)但由于某种原因我插入的break语句是总是执行(或者至少是我认为的原因。)谢谢!

以下是代码:

    if(item != null){
        boolean bool = false;
        int i = 0;
        loop: while(!bool && i <= items.size()-1) {
            if(i==0) {
                if(checkIfAlphabetic(item.getName(), items.get(0).getName())){ items.add(0,item);
                bool = true;
                }
                else{
                    break loop;
                }
            }
            else if(checkIfAlphabetic(items.get(i-1).getName(), item.getName()) && checkIfAlphabetic(item.getName(), items.get(i).getName() )) {
                items.add(i, item);
                bool = true;
            }
            else i++;
        }
        if(!bool){
            items.add(item);
        }
        setModificationTime();
    }

如果有些事情不清楚,我已经原谅了自己。

PS。另外由于某种原因,我想要添加的项目总是被添加两次。

根据要求,checkIfAlphabetic:

的代码
        private boolean checkIfAlphabetic(String search, String target){
    int[] searchInt = search.codePoints().toArray();
    int[] targetInt = target.codePoints().toArray();
    int i = 0;
    while(i<search.length() && i<target.length()){
        if(searchInt[i] > targetInt[i]){
            return false;
        }
        else if(searchInt[i] < targetInt[i]) return true;
        else i++;
    }

    if(search.length() < target.length()){
        return true;
    }
    else return false;

}

1 个答案:

答案 0 :(得分:0)

您的while循环错误。无论如何,它将在第一次迭代后始终停止。

这是按陈述顺序发生的事情。这是伪代码,而不是Java。不要复制/粘贴,它将无法正常工作。

boolean bool = false;
int i = 0;
// entering the while loop:
if (!bool && i <= items.size() - 1) // returns true. We go in the while loop.
if (i == 0) // returns true, we go in that block.
if (check... ) // if this returns true, this happens:
    bool = true;
else // if the previous statement returns false, this happens:
    break;

所以在这里,如果检查...返回false,我们将退出循环。让我们继续在另一种情况下:

// nothing else happens inside the loop, so go back to the loop condition.
if (!bool && i <= items.size() - 1) // Hey, wait a minute, bool is true. So "not" true is false. The condition is therefore not met, let's leave the loop.

所以这就是发生的事情,在一次执行之后,无论如何,你的代码都会退出循环。在您的方案中,bool = true几乎绝对等同于break

这是您需要解决的问题。

如果我必须编写代码,我就是这样做的:

List<Item> items = ... ;
java.util.Collections.sort(items, new ItemNameComparator());

 private static class ItemNameComparator implements Comparator<Item> {
  @Override
  public int compare(Item a, Item b) {
    return a.getName().compareTo(b.getName());
  }
}

如果您使用Java 8:

List<Item> items = ...;
items.sort((a, b) -> a.getName().compareTo(b.getName()));

Java库中存在所有工具,使用它们而不是一次又一次地重新实现它们。