#java #массивы #foreach #for
Вопросы: Для чего нужен foreach, если можно перебирать массив к примеру через цикл for? Можно ли сделать задачу с массивами например на foreach и на цикле for обычном, чтобы получить по итогу один и тот же результат? Зачем нам foreach если есть for? Нашел вот такой пример, но почему-то не получается реализовать его на foreach: public class Test { public static void main(String[] args) { int numer[] = {4, 8, 16, 32, 64, 128}; int denom[] = {2, 2, 4, 4, 2, 8}; for (int i = 0; i < numer.length; i++) { System.out.println(numer[i] + " / " + denom[i] + " равно " + numer[i] / denom[i]); } } }
Ответы
Ответ 1
foreach укорачивает код для перебора коллекций (списки, массивы и т.п.), когда нам нужно только получить элементы из них, без работы с индексами. Примеры для foreach: int numer[] = {4, 8, 16, 32, 64, 128}; for (int i : numer) { System.out.println(i); } Listitems = Arrays.asList("1", "abc"); for (String word : items) { System.out.println(word); } Map nameByValue = new HashMap<>(); nameByValue.put("name", "Vasya"); nameByValue.put("email", "pupkin@email.mail"); for (Map.Entry entry : nameByValue.entrySet()) { System.out.println(entry.getKey() + " = " + entry.getValue()); } Через стандартный цикл: int numer[] = {4, 8, 16, 32, 64, 128}; for (int i = 0; i < numer.length; i++) { System.out.println(numer[i]); } List items = Arrays.asList("1", "abc"); for (int i = 0; i < items.size(); i++) { String word = items.get(i); System.out.println(word); } Map nameByValue = new HashMap<>(); nameByValue.put("name", "Vasya"); nameByValue.put("email", "pupkin@email.mail"); // Через for: // for (Iterator > it = nameByValue.entrySet().iterator(); it.hasNext();) { // // Через while более предпочтительнее чем через for Iterator > it = nameByValue.entrySet().iterator(); while (it.hasNext()) { Map.Entry entry = it.next(); System.out.println(entry.getKey() + " = " + entry.getValue()); } Можно. Но придется для foreach сгенерировать коллекцию с индексами. Чтобы код перебора коллекции был короче. Пример: int numer[] = {4, 8, 16, 32, 64, 128}; for (int i = 0; i < numer.length; i++) { System.out.println(numer[i] + " * 2 -> " + numer[i] * 2); } System.out.println(); for (int i : numer) { System.out.println(i + " * 2 -> " + i * 2); } Код: static List getRange(int length) { List items = new ArrayList<>(); for (int i = 0; i < length; i++) { items.add(i); } return items; } public static void main(String[] args) throws Exception { int numer[] = {4, 8, 16, 32, 64, 128}; int denom[] = {2, 2, 4, 4, 2, 8}; for (int i = 0; i < numer.length; i++) { System.out.println(numer[i] + " / " + denom[i] + " равно " + numer[i] / denom[i]); } System.out.println(); for (int i : getRange(numer.length)) { System.out.println(numer[i] + " / " + denom[i] + " равно " + numer[i] / denom[i]); } } Консоль: 4 / 2 равно 2 8 / 2 равно 4 16 / 4 равно 4 32 / 4 равно 8 64 / 2 равно 32 128 / 8 равно 16 4 / 2 равно 2 8 / 2 равно 4 16 / 4 равно 4 32 / 4 равно 8 64 / 2 равно 32 128 / 8 равно 16 Ответ 2
foreach работает c итераторами. ListsomeIterable = List.of("1", "2"); for (Iterator i = someIterable.iterator(); i.hasNext();) { String item = i.next(); System.out.println(item); } Этот цикл эквивалентен записи: for(String str : someIterable){ System.out.println(item); } У обычного массива итератор отсутствует. Запись вида: for (int numeri : numer) { System.out.println(numeri); } Является синтаксическим сахаром, так как преобразуется в следующий вид int len = numer.length; for (int i = 0; i < len; i++) { int numeri = numer[i]; System.out.println(numeri); } Но тем не менее, foreach спроектирован для работы с текущим элементом одной структуры, а вам необходимо взять i-ый элемент у двух массивов numer и denom Ответ 3
Дополню ответ @gil9red информацией по другим сценариям использования for-each. Для чего нужен foreach, если можно перебирать массив к примеру через цикл for? for-each, а точнее усовершенствованный цикл for (enhanced for loop), задумывался в первую очередь для облегчения работы с коллекциями через итератор. Поддержка массивов добавлена для единообразия кода. Не все коллекции, которые поддерживают перебор через итератор, поддерживают обращение по индексу. Например, множество можно перебрать через for-each: Setletters = new HashSet<>(Arrays.asList("a", "b")); for(String letter : letters) { //... } При этом цикл пройдет по всем элементам множества, но порядок элементов не гарантируется. Обращение к элементу множества по индексу не имеет смысла: for(int i=0; i
Комментариев нет:
Отправить комментарий