有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如果ArrayList中的所有对象共享一个公共值,则返回true的java

我有一个对象的ArrayList,对象是一个指令类,它有以下变量:toDelete、toUse、ID和executed。为了让程序完成,我只需要在ArrayList的所有执行布尔值成员都返回true时才返回true

public boolean getComplete() {
    for (int i = 0; i < instructionArea.size(); i++) {
        if (instructionArea.get(i).getExecuted() == false) {
            instructionsCompleted = false;
            return instructionsCompleted;
        } else
            instructionsCompleted = true;
    }
    System.out.println(instructionsCompleted);
    return instructionsCompleted;
}

这是我目前为止的工作,但我知道这是错误的,程序执行不正确。任何帮助都将不胜感激,谢谢

谢谢你们的回复,我实际上意识到我在其他地方的代码中有一些错误,这导致了它无法工作。指令在本应执行之前就被设置为“已执行”。哦,好吧!谢谢大家


共 (4) 个答案

  1. # 1 楼答案

    假设变量instructionAreainstructionsCompleted是在其他地方定义的,并且对该函数可见,那么您的算法看起来很好。也就是说,这里有两个增强功能,可以使代码更易于阅读(因此也更易于调试)

    请注意,我重新构造了函数,以接收ArrayListBooleans作为参数。在您的例子中,您将用Instruction对象替换Boolean,用instruction.getExecuted()替换bool

    对于每个循环

    由于您使用的是ArrayList,it's a little more efficient使用for each循环而不是索引。考虑下面这样的函数。p>

    public boolean areAllTrue(ArrayList<Boolean> bools) {
        for (Boolean bool : bools) {
            if (!bool) return false;  // Return false if any element isn't true.
        }
        return true;
    }
    

    Java的流式API

    您还可以使用Java's Streaming API将此函数一行删除

    public boolean areAllTrue(ArrayList<Boolean> bools) {
        return bools.stream().allMatch(bool -> bool == true);
    }
    
  2. # 2 楼答案

    public boolean getComplete() {
        return instructionArea.stream().allMatch(InstructionArea::getExecuted);
    }
    

    如果所有元素都从getExecuted()返回true,那么您的逻辑可以表示为返回true,这段代码正好反映了这一点

    它还使用了method reference(而不是lambda),这使得IMHO的代码更加优雅

  3. # 3 楼答案

    让我们检查一下问题:
    一切都为真时,您希望返回真

    你可以颠倒这个要求:
    只有一个为false时返回false

    按照这种逻辑,您可以执行以下操作:

    for (int i = 0; i < instructionArea.size(); i++) {
            if(!instructionArea.get(i).getExecuted()) {
                return false; //when only one is false, it is not completed
            }
        }
    return true; // we iterated over all elements and all were executed, hence it is completed
    
  4. # 4 楼答案

    或者你做一个相反的操作来保存另一行:)它的流API的样式如下;“是否存在任何匹配,尚未执行)

    public boolean getComplete() {
        return !instructionArea.stream().anyMatch(i -> !i.getExecuted());
    }