Java: 2-присваивания-2-инициализации внутри цикла for не разрешены? - PullRequest
0 голосов
/ 11 апреля 2010

Смежный вопрос об объявлении-инициализации-декларации.

$ javac MatchTest.java 
MatchTest.java:7: ')' expected
  for((int i=-1 && String match="hello"); (i=text.indexOf(match)+1);)
          ^
MatchTest.java:7: ';' expected
  for((int i=-1 && String match="hello"); (i=text.indexOf(match)+1);)
                         ^
MatchTest.java:7: ';' expected
  for((int i=-1 && String match="hello"); (i=text.indexOf(match)+1);)
                                       ^
MatchTest.java:7: not a statement
  for((int i=-1 && String match="hello"); (i=text.indexOf(match)+1);)
                                          ^
MatchTest.java:7: illegal start of expression
  for((int i=-1 && String match="hello"); (i=text.indexOf(match)+1);)
                                                                    ^
5 errors
$ cat MatchTest.java 
import java.util.*;
import java.io.*;

public class MatchTest {
 public static void main(String[] args){
  String text = "hello0123456789hello0123456789hello1234567890hello3423243423232";
  for((int i=-1 && String match="hello"); (i=text.indexOf(match)+1);)
   System.out.println(i);
 }
}

Ответы [ 4 ]

3 голосов
/ 11 апреля 2010

Вы не можете объявить и инициализировать переменную второго типа, но вы можете иметь несколько переменных (возможно, с инициализацией) одного типа.

Это распространенная идиома кэширования for в локальной переменной:

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;
}
3 голосов
/ 11 апреля 2010

Вы должны сделать это с ",". Но только из того же типа.

Например:

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

Вы не можете сделать что-то вроде:

for ( int i=0, String j= "hi" ; i < something ; i++)
2 голосов
/ 11 апреля 2010

Не очень понятно, что вы хотите сделать. Но я думаю, что вы пытаетесь получить все вхождения строки "привет" в вашей большей строке. Если это так, вы можете попробовать:

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

Я использовал перегруженную версию indexOf , которая использует индекс для начала поиска в качестве аргумента.

0 голосов
/ 11 апреля 2010
Ответ

polygenelubricants содержит заслуживающие внимания пункты. Если вы измените 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 
        } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...