Java:2-assignments-2-Initialization for循环内部不允许?

Java:2-assignments-2-Initialization for循环内部不允许?,java,initialization,variable-assignment,Java,Initialization,Variable Assignment,你应该用,。但只来自同一类型 例如: for ( int i=0, j= 0 ; i < something ; i++, j++) 你不能这样做: for ( int i=0, String j= "hi" ; i < something ; i++) 你应该用,。但只来自同一类型 例如: for ( int i=0, j= 0 ; i < something ; i++, j++) 你不能这样做: for ( int i=0, String j= "hi" ; i &

你应该用,。但只来自同一类型

例如:

for ( int i=0, j= 0 ; i < something ; i++, j++)
你不能这样做:

for ( int i=0, String j= "hi" ; i < something ; i++)

你应该用,。但只来自同一类型

例如:

for ( int i=0, j= 0 ; i < something ; i++, j++)
你不能这样做:

for ( int i=0, String j= "hi" ; i < something ; i++)

您不能声明和初始化第二种类型的变量,但可以有多个变量,可能初始化为同一类型

这是在局部变量中缓存绑定的常用习惯用法:

String s = "Hello";
for (int i = 0, L = s.length(); i < L; i++) {
    System.out.println(s.charAt(i));
} // prints "H", "e", "l", "l", "o"
这是映射1D-2D数组的常用习惯用法:

int[] arr1d = new int[9];
int[][] arr2d = {
    { 1, 2, 3 },
    { 4, 5, 6 },
    { 7, 8, 9 },
};
for (int r = 0, i = 0; r < 3; r++) {
    for (int c = 0; c < 3; c++) {
        arr1d[i++] = arr2d[r][c];
    }
}
System.out.println(Arrays.toString(arr1d));
// prints "[1, 2, 3, 4, 5, 6, 7, 8, 9]"
从两端输入两个迭代器的习惯用法也很常见:

boolean isPalindrome(String s) {
    for (int i = 0, j = s.length() - 1; i < j; i++, j--) {
        if (s.charAt(i) != s.charAt(j)) {
            return false;
        }
    }
    return true;
}

您不能声明和初始化第二种类型的变量,但可以有多个变量,可能初始化为同一类型

这是在局部变量中缓存绑定的常用习惯用法:

String s = "Hello";
for (int i = 0, L = s.length(); i < L; i++) {
    System.out.println(s.charAt(i));
} // prints "H", "e", "l", "l", "o"
这是映射1D-2D数组的常用习惯用法:

int[] arr1d = new int[9];
int[][] arr2d = {
    { 1, 2, 3 },
    { 4, 5, 6 },
    { 7, 8, 9 },
};
for (int r = 0, i = 0; r < 3; r++) {
    for (int c = 0; c < 3; c++) {
        arr1d[i++] = arr2d[r][c];
    }
}
System.out.println(Arrays.toString(arr1d));
// prints "[1, 2, 3, 4, 5, 6, 7, 8, 9]"
从两端输入两个迭代器的习惯用法也很常见:

boolean isPalindrome(String s) {
    for (int i = 0, j = s.length() - 1; i < j; i++, j--) {
        if (s.charAt(i) != s.charAt(j)) {
            return false;
        }
    }
    return true;
}

你想做什么还不是很清楚。但我猜你是想在你的大字符串中找到所有出现的字符串hello。如果是,您可以尝试:

String text = "hello0123456789hello0123456789hello1234567890hello3423243423232";
String match="hello";
for(int i=0; (i = text.indexOf(match,i)) != -1;i += match.length()){    
    System.out.println(i);      
}
输出:

0
15
30
45

我使用了重载版本,该版本以索引作为开始搜索的参数。

不太清楚您想要做什么。但我猜你是想在你的大字符串中找到所有出现的字符串hello。如果是,您可以尝试:

String text = "hello0123456789hello0123456789hello1234567890hello3423243423232";
String match="hello";
for(int i=0; (i = text.indexOf(match,i)) != -1;i += match.length()){    
    System.out.println(i);      
}
输出:

0
15
30
45

我使用了重载版本,该版本以索引作为开始搜索的参数。

Polygene的答复包含值得注意的要点。如果将i++更改为++i,则增加分配顺序会更改,并且很容易出现错误

$ javac ThirdDArray.java 
$ java ThirdDArray      
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
 at ThirdDArray.main(ThirdDArray.java:17)
$ cat ThirdDArray.java 

import java.util.*; 
import java.io.*; 

public class ThirdDArray { 


        public static void main(String[] args) { 

                int[] arr1d = new int[9]; 
                int[][] arr2d = { 
                        { 1, 2, 3 }, 
                        { 4, 5, 6 }, 
                        { 7, 8, 9 }, 
                }; 
                for (int r = 0, i = 0; r < 3; r++) { 
                        for (int c = 0; c < 3; c++) { 
                                //THIS IS THE TRICK POINT!  
                                // ++i means "first increase then assignment" 
                                // i++ means "first assignment then increase" 
                                arr1d[++i] = arr2d[r][c]; 
                        } 
                } 

                // ERROR ONLY DUE TO THE ASSIGNMENT-INCREASE order! 
                System.out.println(Arrays.toString(arr1d)); 
                // started from 1 so go out of the allocated size 
        } 
}

Polygene的答复包含了值得注意的几点。如果将i++更改为++i,则增加分配顺序会更改,并且很容易出现错误

$ javac ThirdDArray.java 
$ java ThirdDArray      
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
 at ThirdDArray.main(ThirdDArray.java:17)
$ cat ThirdDArray.java 

import java.util.*; 
import java.io.*; 

public class ThirdDArray { 


        public static void main(String[] args) { 

                int[] arr1d = new int[9]; 
                int[][] arr2d = { 
                        { 1, 2, 3 }, 
                        { 4, 5, 6 }, 
                        { 7, 8, 9 }, 
                }; 
                for (int r = 0, i = 0; r < 3; r++) { 
                        for (int c = 0; c < 3; c++) { 
                                //THIS IS THE TRICK POINT!  
                                // ++i means "first increase then assignment" 
                                // i++ means "first assignment then increase" 
                                arr1d[++i] = arr2d[r][c]; 
                        } 
                } 

                // ERROR ONLY DUE TO THE ASSIGNMENT-INCREASE order! 
                System.out.println(Arrays.toString(arr1d)); 
                // started from 1 so go out of the allocated size 
        } 
}

你想对循环做什么?你想对循环做什么?不起作用。此行有多个标记-标记int的语法错误,请删除此标记,但如果删除第二个int,则会删除。@Chris:谢谢,我刚刚修复了我的答案。不起作用。此行有多个标记-标记int的语法错误,请删除此标记,但如果删除第二个int,则会删除。@Chris:谢谢,我刚刚修复了我的答案。棘手的赋值arr1d[I++]=arr2d[r][c];。显然,i++的意思是先做赋值,然后再增加,否则会出错,请参阅背诵回复。棘手的赋值arr1d[i++]=arr2d[r][c];。显然,i++的意思是先做赋值,然后再增加,否则会出现错误,请参阅背诵回复。问题是增量后与增量前。另请参见:问题是增量后与增量前。另见: