как заменить циклы с foreach в этом случае (в Java)? - PullRequest
1 голос
/ 25 декабря 2011

Я работал над кодом и столкнулся с этим. Как я могу использовать for-each в приведенном ниже коде, чтобы выполнить то же самое, что показано в цикле точно ниже (два вложенных цикла):

String names[3] = {"A","B","C"};
int result[][] = calculate_exchange(calculate_matrix());//function call returns a 3x3 matrix
        /*for(int i[]:result){
            for(int j:i){
                if(j!=0){
                    System.out.println(names[]);//how do I use the i'th element?
                    //names[i] gives an error(obviously!!!)
                }
            }
        }*/
        for(int r=0;r<3;r++){//this loop works fine
            for(int c=0;c<3;c++){
                if(result[r][c]!=0){
                    System.out.println(names[r]+"->"+names[c]+" = "+result[r][c]);
                }
            }
        }

for(int i[]:result) делает i массивом, тогда можно ли будет использовать for-each в этом случае?

PS : мой код работает без использования for-each, я прошу это просто для удовлетворения моего любопытства.

Ответы [ 4 ]

2 голосов
/ 25 декабря 2011

Из Sun Java Docs :

Так когда же вам следует использовать цикл for-each?

В любое время, когда вы можете.Это действительно украшает ваш код.К сожалению, вы не можете использовать его везде.Рассмотрим, например, метод экспургата.Для удаления текущего элемента программе необходим доступ к итератору.Цикл for-each скрывает итератор, поэтому вы не можете вызвать remove.Поэтому цикл for-each нельзя использовать для фильтрации.Точно так же он не может использоваться для циклов, где вам нужно заменить элементы в списке или массиве при его прохождении.

1 голос
/ 25 декабря 2011

В этом случае вы не можете выполнить чистую замену, потому что в цикле используется c. (так что вы не можете полностью устранить это)

Вы можете написать

for(int r=0,c;r<3;r++){//this loop works fine
   c=0;
   for(int[] row: result[r]){
      if(row[c]!=0)
         System.out.println(names[r]+"->"+names[c]+" = "+row[c]);
      c++;
   }
 }
0 голосов
/ 25 декабря 2011

Вы можете использовать итератор в Java, который действует как для каждого цикла вот пример

// Demonstrate iterators. 
import java.util.*; 
class IteratorDemo { 
public static void main(String args[]) { 
// create an array list 
ArrayList al = new ArrayList(); 
// add elements to the array list 
al.add("C"); 
al.add("A"); 
al.add("E"); 
al.add("B"); 
al.add("D"); 
al.add("F"); 
// use iterator to display contents of al 
System.out.print("Original contents of al: "); 
Iterator itr = al.iterator(); 
while(itr.hasNext()) {

Object element = itr.next(); 
System.out.print(element + " ");

} 
System.out.println(); 
// modify objects being iterated 
ListIterator litr = al.listIterator(); 
while(litr.hasNext()) {

Object element = litr.next(); 
litr.set(element + "+");

} 
System.out.print("Modified contents of al: "); 
itr = al.iterator();
while(itr.hasNext()) {

Object element = itr.next(); 
System.out.print(element + " ");

} 
System.out.println(); 
// now, display the list backwards 
System.out.print("Modified list backwards: "); 
while(litr.hasPrevious()) {

Object element = litr.previous(); 
System.out.print(element + " ");

} 
System.out.println(); 
} 
}

Свяжитесь, если у вас есть какие-либо сомнения

0 голосов
/ 25 декабря 2011
for (int[] row : result) {
    for (int cell : row) {
        // do something with the cell
    }
}

Но так как вашему коду нужен индекс строки и ячейки в строке, цикл foreach просто не подходит для работы.Сохраняйте код как есть.

Вы можете просто использовать длину каждого массива вместо жесткого кодирования 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...