Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 帮助更新循环条件_Java_Arrays_Exception_For Loop - Fatal编程技术网

Java 帮助更新循环条件

Java 帮助更新循环条件,java,arrays,exception,for-loop,Java,Arrays,Exception,For Loop,好的。因此,我试图编写一个应用程序,以正确的操作顺序解决问题(即PEMDAS,但没有PE lol)。我可能做错了,但不管怎样。我需要帮助的是,作为对数组中每个元素的迭代,如果它是运算符,我会删除两个元素(运算符周围的数字,因为我将运算符替换为正确的计算,因此一个包含三个元素的数组,5+5,将成为一个包含一个元素的数组,10),这很好,但是for语句的条件不会更新,因此,换句话说,当我更新数组时,array.length会变短,但是for语句无法识别这一点,并继续传递数组的边界,这会导致边界外错误

好的。因此,我试图编写一个应用程序,以正确的操作顺序解决问题(即PEMDAS,但没有PE lol)。我可能做错了,但不管怎样。我需要帮助的是,作为对数组中每个元素的迭代,如果它是运算符,我会删除两个元素(运算符周围的数字,因为我将运算符替换为正确的计算,因此一个包含三个元素的数组,5+5,将成为一个包含一个元素的数组,10),这很好,但是for语句的条件不会更新,因此,换句话说,当我更新数组时,array.length会变短,但是for语句无法识别这一点,并继续传递数组的边界,这会导致边界外错误。最好的解释方法是使用我的代码,因此如下所示:

for (i = 0; i < splitEquation.length; i++){
        if (splitEquation[i].equals("*")){
            splitEquation[i] = Double.toString(Double.parseDouble(splitEquation[i - 1]) * Double.parseDouble(splitEquation[i + 1]));
            splitEquation = removeIndex(splitEquation, i - 1);
            splitEquation = removeIndex(splitEquation, i + 1);
            solution += Double.parseDouble(splitEquation[i - 1]);

        }
}
提前感谢,, -埃里克


另外,如果您需要我的代码功能的任何说明,请告诉我:)

使用
阵列列表将使您的生活更加轻松:

ArrayList<String> splitEquation = 
    new ArrayList<String>(Arrays.toList("5","*","5"));

for (i = 0; i < splitEquation.size(); i++){
    if (splitEquation.get(i).equals("*")) {
        splitEquation.set(i, 
            (Double.toString(Double.parseDouble(splitEquation.get(i - 1)) * 
                Double.parseDouble(splitEquation.get(i + 1))));
        splitEquation.remove(i - 1); // shortens array by 1
        splitEquation.remove(i); // this used to be (i + 1)
        i--; // move back one (your computed value)
        solution += Double.parseDouble(splitEquation.get(i));

    }
}
ArrayList拆分公式=
新的ArrayList(Arrays.toList(“5”、“*”、“5”);
对于(i=0;i
也就是说,您真的需要修改阵列吗

编辑:问题现在更清楚了,数组正在修改,因为它需要作为一系列表达式进行计算。他还想添加加法和减法:

递归函数是您的朋友:)

publicstaticdoubleresult(arraylistmysequence,doubletotal,int-index)
{
如果(索引==0)
total=Double.parseDouble(mySequence.get(index));
如果(索引==(mySequence.size()-1))
返回总数;
else if(mySequence.get(index.equals)(*))
total*=Double.parseDouble(mySequence.get(index+1));
else if(mySequence.get(index.equals)(/))
total/=Double.parseDouble(mySequence.get(index+1));
else if(mySequence.get(index.equals)(+))
{
索引++;
double start=double.parseDouble(mySequence.get(index));
总计+=结果(mySequence、start、index);
返回总数;
}
else if(mySequence.get(index.equals)(“-”)
{
索引++;
double start=double.parseDouble(mySequence.get(index));
总计-=结果(mySequence、start、index);
返回总数;
}
索引++;
返回结果(mySequence、total、index);
}
公共静态void main(字符串参数[])
{
ArrayList拆分公式=
新阵列列表(
数组。asList(“5”,“*”,“5”,“/”,“5”,“*”,“4”,“-”,“3”,“*”,“8”);
double myResult=结果(拆分公式,0,0);
System.out.println(“答案是:“+myResult”);
}
输出:

答案是:-4.0


当您可以将输入数组用作只读并创建输出数组列表(或更好的堆栈)时,为什么要修改输入数组呢?

我认为,如果您使用动态结构,如,您应该能够解决该问题

据此:

容量是指阵列的大小 用于将元素存储在 列表它总是至少和它一样大 与列表大小相同。正如元素一样 将其容量添加到ArrayList 自动增长


在前一篇文章中,使用动态数据结构应该可以解决您的问题,我认为当您从列表中删除和添加元素时,同样的机制也适用。但是,您可能需要实现某种机制来跟踪每次更换后项目的位置。

但最终这是否仍然会超出范围?如果我删除它,for语句仍将继续。嗯,修改它是我能想到的唯一方法:/不过谢谢你!它不会因为
i--而越界-它将迭代器设置为有效元素。然后,它会被循环递增,并与
i
进行比较,这会导致循环退出(如果您位于arraylist的末尾),在适当的位置修改数组的目的是什么?您想得到一个计算值数组吗?为什么不使用第二个数组作为结果呢?嗯,你的意思是,例如,在我得到5+5后,我将其放入另一个数组,然后继续迭代?正确。您只需将结果放入第二个ArrayList中,然后执行
i++
向前跳一个,而不是删除元素并执行
i--
Lol。不知道如何执行该操作。因为这样我就必须遍历每个新数组。我对这方面还是新手:)。您试图从for循环中修改数组或集合,这会导致灾难——除非您可以使用迭代器删除该项。更好的方法是简单地循环整个集合,并在循环时从中提取信息,将其放入一个堆栈(或两个,一个用于运算符,一个用于数字),这只是另一个集合。
ArrayList<String> splitEquation = 
    new ArrayList<String>(Arrays.toList("5","*","5"));

for (i = 0; i < splitEquation.size(); i++){
    if (splitEquation.get(i).equals("*")) {
        splitEquation.set(i, 
            (Double.toString(Double.parseDouble(splitEquation.get(i - 1)) * 
                Double.parseDouble(splitEquation.get(i + 1))));
        splitEquation.remove(i - 1); // shortens array by 1
        splitEquation.remove(i); // this used to be (i + 1)
        i--; // move back one (your computed value)
        solution += Double.parseDouble(splitEquation.get(i));

    }
}
public static double result(ArrayList<String> mySequence, double total, int index)
{
    if (index == 0)
        total = Double.parseDouble(mySequence.get(index));

    if (index == (mySequence.size() - 1))
        return total;
    else if (mySequence.get(index).equals("*"))
        total *= Double.parseDouble(mySequence.get(index + 1));
    else if (mySequence.get(index).equals("/"))
        total /= Double.parseDouble(mySequence.get(index + 1));
    else if (mySequence.get(index).equals("+"))
    {
        index++;
        double start = Double.parseDouble(mySequence.get(index));
        total += result(mySequence, start, index);
        return total;
    }
    else if (mySequence.get(index).equals("-"))
    {
        index++;
        double start = Double.parseDouble(mySequence.get(index));
        total -= result(mySequence, start, index);
        return total;
    }

    index++;
    return result(mySequence, total, index);

}

public static void main(String args[])
{
    ArrayList<String> splitEquation = 
        new ArrayList<String>(
            Arrays.asList("5","*","5","/","5","*","4","-","3","*","8"));

    double myResult = result(splitEquation, 0, 0); 
    System.out.println("Answer is: " + myResult);
}