如何正确使用“ForEach”循环?

时间:2017-07-11 03:50:01

标签: java loops foreach

我正在练习Java,而这次我正在编写一个程序   1.将2个二进制数转换为十进制数   2.计算这2个十进制数的总和
  3.以二进制和十进制显示结果 我知道我在代码中没有采用有效的方式,但这是故意的 (所以我只用一个项目就可以练习更多)
但是我的代码中存在一个问题,即当它要转换时 二进制到十进制
 它总是将第一个数字显示为“3”,第二个数字显示为第二个数字 为“2”。
 有人能告诉我我做错了什么吗?提前谢谢。
(我已经尝试在互联网上搜索答案,但我找不到它。
对不起,如果我因为一个愚蠢的错误而浪费你的时间。)

package binary2decimal2binary;
import java.util.Scanner;
import java.util.ArrayList;

public class Binary2Decimal2Binary {
private static long binary1;
private static long binary2;
private final static ArrayList POWERSOF2 = new ArrayList<Integer>();
private final static ArrayList<Integer> SEPARATED2 = new ArrayList<Integer>();
private static int temp1 = 0;
private static int result1 = 0;
private static int temp2 = 0;
private static int result2 = 0;
private final static ArrayList<Integer> SEPARATED1 = new ArrayList<Integer>();



static void binary2ArrayList(long binary1, long binary2){
String separating1 = String.valueOf(binary1);
System.out.println("Debugger 1 :" + separating1);
for(int i = 0; i < separating1.length(); i++) {
    int j =(int) Character.digit(separating1.charAt(i), 10);
    SEPARATED1.add(j);}
 String separating2 = String.valueOf(binary2);
 System.out.println("Debugger2 :" + separating2);
 for(int x = 0; x < separating2.length(); x++) {
     int y =(int) Character.digit(separating2.charAt(x), 10);
     SEPARATED2.add(y);
 }
 Arraylist2Decimal();

}



static void Arraylist2Decimal(){

   for(Integer intValue  : SEPARATED1 ){
   int i = 0;
   temp1 = (int) SEPARATED1.get(i);
   if(temp1 == 1){
       result1 = (int) POWERSOF2.get(i) + result1;

   }
   i += 1;
   System.out.println("Debugger 3:" + i);
   }

   for(Integer intValue: SEPARATED2){
   int k = 0;
   temp2 = (int) SEPARATED2.get(k);
   if(temp2 == 1){

   result2 = (int) POWERSOF2.get(k) + result2;

   } k += 1;
   System.out.println("Debugger 4:" + k);
           }
};



    public static void main(String[] args) {
        POWERSOF2.add(1);
        POWERSOF2.add(2);
        POWERSOF2.add(4);
        POWERSOF2.add(8);
        POWERSOF2.add(16);
        POWERSOF2.add(32);
        POWERSOF2.add(64);
        POWERSOF2.add(128);
        POWERSOF2.add(256);
        POWERSOF2.add(512);
        POWERSOF2.add(1024);
        POWERSOF2.add(2048);
        POWERSOF2.add(4096);
        POWERSOF2.add(8192);
        POWERSOF2.add(16384);
        POWERSOF2.add(32768);

       Scanner scan = new Scanner(System.in);

 System.out.println("Input first binary number.");
 binary1 = scan.nextLong();
 System.out.println("Input second binary number.");
 binary2 = scan.nextLong();
 scan.close();
 binary2ArrayList(binary1,binary2);

 System.out.println("First Number Converted:" + result1);
 System.out.println("Second Number Converted:" + result2);



    }



}

编辑:我添加了一些代码来检查我的循环发生了什么, 并且发生了一些奇怪的事情 INPUT:
101个
10个
OUTPUT:
调试器1:101
Debugger2:10
调试器3:1
调试器3:1
调试器3:1
调试器4:1
调试器4:1
转换的第一个数字:3
转换的第二个数字:2
即使我添加了 i + = 1;和
k + = 1;在循环中,值永远不会是 往上走。请帮帮我。

2 个答案:

答案 0 :(得分:0)

这里实际上有很多东西需要一些改进。

  • 从Java 1.5开始,有Generics。尽可能使用 (即ArrayList<Integer>代替原始类型 ArrayList)。

  • 在定义变量时使用接口而不是实现(即List<Integer> list = new ArrayList<Integer>();而不是ArrayList<Integer> list = new ArrayList<Integer>();)。

  • 不要过度使用static关键字。利用类和封装等OOP概念。从长远来看,它可以防止不必要的副作用。

  • 尝试将privatefinal添加到尽可能多的字段中。它可以防止重新分配和其他类在与它们无关时访问这些值。

  • 您需要改进循环: for(Type element : Iterable)已经为您提供了该可迭代中的元素。在该循环中调用separated1.get(i)没有意义(特别是因为i总是0),因为单个元素已经可以通过element访问。

总而言之,您的代码看起来应该是这样的:

....

private final List<Integer> separated2 = new ArrayList<Integer>();

....

for(Integer intValue : separated2) {
    // your logic using intValue
    ....
}

编辑:传统for循环的等效示例如下所示:

private final List<Integer> separated2 = new ArrayList<Integer>();

....

for(int i = 0; i < separated2.size(); i++) {
     Integer intValue = separated2.get(i);
     // your logic using intValue
    ....
}

答案 1 :(得分:0)

要将二进制字符串转换为整数使用:

Integer.parseInt("binaryString",2);

这是工作代码。

public static void main(String[] args) throws ParseException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Input first binary number.");
        String firstBinary = scanner.next("[0-1]+");
        System.out.println("Input second binary number.");
        String secondBinary = scanner.next("[0-1]+");

        int int1 = convertToInt(firstBinary);
        int int2 = convertToInt(secondBinary);

        int sum = calculateSum(int1, int2);

        display(firstBinary, secondBinary, int1, int2);

        System.out.println("sum is " + sum);
    }

    public static void display(String binary1, String binary2, int arg1, int arg2) {
        System.out.printf("%1s10 = %2d5\n%3s10 = %4d5", binary1, arg1, binary2, arg2);
    }

    public static int convertToInt(String binary) {
        return Integer.parseInt(binary, 2);
    }

    public static int calculateSum(int arg1, int arg2) {
        return arg1 + arg2;
    }

此程序首先要求您输入两个二进制文件。它将它们转换为Integer并计算它们的总和。 Finall它会将结果显示给控制台。