Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Религиозные войны > Foreach для Enumeration


Автор: Karadul 13.6.2012, 18:52
foreach не работает?

Автор: Skipy 14.6.2012, 11:38
Цитата(Karadul @ 13.6.2012,  18:52)
foreach не работает?

Для Enumeration? Ну проверьте.

Автор: priam220 14.6.2012, 13:55
foreach тут как бы не нужен, почитать почему можно http://javarevisited.blogspot.com/2010/10/what-is-difference-between-enumeration.html. 
вкратце:
Цитата

Only major difference between Enumeration and iterator is Iterator has a remove() method while Enumeration doesn't. Enumeration acts as Read-only interface, because it has the methods only to traverse and fetch the objects, where as by using Iterator we can manipulate the objects like adding and removing the objects


Автор: Karadul 14.6.2012, 14:31
Если я правильно помню, foreach требует Iterable, а не Iterator.

Автор: priam220 14.6.2012, 15:03
Все правильно помните, осталось только глянуть что из себя представляет http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Iterable.html.

Автор: Karadul 14.6.2012, 15:28
Но можно же кидать исключение на remove(), для кого foreach придумали-то?

Автор: priam220 14.6.2012, 15:47
Почти уверен, что и такой подход оскорбил бы Вас не менее: что за хрень! в жава есть классы, имеющие паблик методы remove! но на попытку удалить там что то оно мне ругается!  ай-ай! какие они там все балбесы, спросили бы у меня, я б им сказал как надо!
 smile 


Автор: jk1 14.6.2012, 16:22
Цитата

что за хрень!


Не такая уж и хрень. Если вспомнить доки на java.util.Iterator, то там операция remove() заявлена как optional, то есть она может не быть реализована и кидать UnsupportedOperationException:

Цитата

void remove()

Removes from the underlying collection the last element returned by the iterator (optional operation). This method can be called only once per call to next. The behavior of an iterator is unspecified if the underlying collection is modified while the iteration is in progress in any way other than by calling this method.

Throws:
UnsupportedOperationException - if the remove operation is not supported by this Iterator.


Так что реализация Enumeration'ом интерфейса Iterable контракта не нарушает.

Автор: priam220 14.6.2012, 17:26
Вынужден признать свою неправоту и принести свои извинения товарищам по цеху, за безосновательный пафос! И принять этот красивый подсрачник в награду. 
Тогда действительно, наблюдается избыточность, наверное Enumeration, существующий с 1.0 будет умирать.
А все казалось таким красивым.

Автор: Pawl 14.6.2012, 18:49
Цитата(priam220 @  14.6.2012,  17:26 Найти цитируемый пост)
Тогда действительно, наблюдается избыточность

А как сделать лучше напишете?

Автор: AntonSaburov 14.6.2012, 19:31
А может попробовать самому поискать ответ ?

Автор: priam220 14.6.2012, 20:15
Цитата(Pawl @  14.6.2012,  18:49 Найти цитируемый пост)
А как сделать лучше напишете?

1. Думаю, лучше было бы сделать что то однозначное.  
2. Я думаю, многие согласятся, что провайдить интерфейс, которого не должно быть согласно логической концепции объекта (например велосипеду метод startEngine() ) не совсем верно. Т.е. применительно к нашему вопросу UnmodifiableCollection<E> implements Collection<E> выглядит не совсем красиво, имхо. 
3. Лучше - сложный оценочный фактор. У меня нет причин не доверять разработчикам системы, - возможно маленькие нестыковки в объектной модели языка, с лишком окупаются другими профитами. 
  

Автор: Karadul 14.6.2012, 20:20
Ситуация, когда прошло 7 с лишним лет, а некоторым авторам нинужен foreach, говорит о, как бы сказать, их отсталости. В питоне, например, вообще нет сишного for, только foreach.

Автор: jk1 15.6.2012, 09:31
Karadul, а в чем собственно проблема?

Можно же делать вот так:
Код

while (nets.hasMoreElements()) {
      NetworkInterface net =  nets.nextElement();


Функционально будет полным эквивалентом foreach. Что же до синтаксического сахара, то пора бы понять, что в Java его практически нет. Если он для Вас так важен, то берите Scala и забудьте про Java как про страшный сон.

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

Цитата

В питоне, например, вообще нет сишного for, только foreach. 


что порождает костыли в случае, когда нужно вызвать функцию четко определенное число раз или перебрать последовательные числа:
Код

for _ in xrange(n): foo()


На этом дискуссию предлагаю закрыть, так как она давно ушла в оффтоп.

Автор: Karadul 15.6.2012, 11:27
Цитата(jk1 @  15.6.2012,  09:31 Найти цитируемый пост)
Цитата

В питоне, например, вообще нет сишного for, только foreach. 


что порождает костыли в случае, когда нужно вызвать функцию четко определенное число раз или перебрать последовательные числа:

Это не такие страшные костыли, а foreach используется в питоне гораздо чаще for.

Просто поражает упоротость (некоторых) жавоидов, 7-8 лет прошло, а им foreach, видите ли, нинужен. А другие их еще защищают. 

Если мосье считает, что оффтоп, предлагаю посты, начиная с оффтопа, перенести в другую тему. На сырцах вообще был раздел "религиозные войны".

Автор: dorogoyIV 15.6.2012, 18:11
Цитата(AntonSaburov @  14.6.2012,  19:31 Найти цитируемый пост)
А может попробовать самому поискать ответ ?

http://www.codingrus.ru/readarticle.php?article_id=647

Автор: Karadul 15.6.2012, 20:40
Я бы назвал тему "Почему в яве так не любят foreach и все, что младше 10 лет". 
И все-таки жалко, что у вас холиворов нету.

Автор: k0rvin 15.6.2012, 21:38
Цитата(Karadul @ 15.6.2012,  20:40)
Я бы назвал тему "Почему в яве так не любят foreach и все, что младше 10 лет". 
И все-таки жалко, что у вас холиворов нету.

А http://forum.vingrad.ru/forum/holy-wars.html что?

Но вообще джавовский foreach весьма убог, в CL loop (и iter из пакета iterate) намного круче.

Автор: Karadul 15.6.2012, 21:52
О, действительно.
А что такое CL?

Убог/не убог, но уже лучше, чем ничего, меньше можно напортить (ошибки при копипасте вложенных циклов, когда забывают исправить переменную), не говоря о том, что foreach не требует индексации. Ну и выглядит лучше, чем ручной вызов итератора.

Автор: k0rvin 15.6.2012, 22:12
Цитата(Karadul @ 15.6.2012,  21:52)
А что такое CL?

Common Lisp

Цитата(Karadul @ 15.6.2012,  21:52)
Убог/не убог, но уже лучше, чем ничего, меньше можно напортить (ошибки при копипасте вложенных циклов, когда забывают исправить переменную), не говоря о том, что foreach не требует индексации. Ну и выглядит лучше, чем ручной вызов итератора.

вот только такую фишку с его помощью не сделать:
Код

int[] xs = new int[] { 1, 2, 3, 4, 5 };
int[] ys = new int[xs.length];
for (int x : xs, int &y : ys) { // & означает ссылку
  y = x*x;
}
// ys = { 1, 4, 9, 16, 25 }


Впрочем в CL loop этого тоже не сделать, но в C++, думаю, можно что-такое сотворить.

Добавлено через 9 минут и 18 секунд
И вот такую штуку не сделаешь:
Код

int[] xs = new int[] { 1, 2, 3 };
int[] ys = new int[] { 4, 5, 6 };
int sum = 0;
for (int x : xs, int y : ys) {
  sum += x + y;
}

а в CL loop сделаешь =)

Автор: Pawl 15.6.2012, 22:48
Цитата(k0rvin @  15.6.2012,  22:12 Найти цитируемый пост)
а в CL loop сделаешь =)

зато в java можно извратиться smile:
Код

import static java.util.Arrays.copyOfRange;

public class ForEachTest {
    public static void main(String[] args) {
        int[] xs = new int[] { 1, 2, 3 };
        int[] ys = new int[] { 4, 5, 6 };
        int sum = 0;
        for (int x : xs) {            
            for (int y : ys) {
                sum += x + y;
                break;
            }
            ys = copyOfRange(ys, 1, ys.length);
        }
        System.out.println(sum);
    }
}

Автор: Karadul 15.6.2012, 23:07
Цитата(k0rvin @  15.6.2012,  22:12 Найти цитируемый пост)
Цитата(Karadul @ 15.6.2012,  21:52)
А что такое CL?

Common Lisp

Фу. Вы небось теми же руками потом на форуме пишете?

Цитата(k0rvin @  15.6.2012,  22:12 Найти цитируемый пост)
вот только такую фишку с его помощью не сделать:

Это map чтоли? Библиотекой наверняка можно, а встроенных средств ФП в яве нет.

Не, фп в питоне очень приятное и не слишком тошнотное. Линку не юзал, но тоже с виду неплох + параллелизация искаропки.

Автор: k0rvin 17.6.2012, 20:39
Цитата(Karadul @ 15.6.2012,  23:07)
Фу. Вы небось теми же руками потом на форуме пишете?

Это мне любитель джавы говорит?  smile 

Цитата(Karadul @ 15.6.2012,  23:07)
Это map чтоли? Библиотекой наверняка можно

Нет, не map.

Цитата(Karadul @ 15.6.2012,  23:07)
а встроенных средств ФП в яве нет.

А при чем тут ФП?

Автор: Karadul 18.6.2012, 01:35
Цитата(k0rvin @  17.6.2012,  20:39 Найти цитируемый пост)
Цитата(Karadul @ 15.6.2012,  23:07)
Фу. Вы небось теми же руками потом на форуме пишете?

Это мне любитель джавы говорит?  smile 

Ну любитель - не любитель, но пользуюсь. А какое лисп имеет отношение к яве в частности и к промышленной разработке вообще? Он за пределами университетов кому-то нужен?


Цитата(k0rvin @  17.6.2012,  20:39 Найти цитируемый пост)
Нет, не map.

А что? Уж очень похоже

Код

ys = map(lambda x: x*x, xs)


Код

sum = reduce(lambda x,y: x+y, map(lambda x, y: x+y, xs, ys))


Цитата(Pawl @  15.6.2012,  22:48 Найти цитируемый пост)
Код

for (int x : xs) {            
            for (int y : ys) {
                sum += x + y;
                break;
            }

Там не вложенные for.

Автор: k0rvin 18.6.2012, 06:29
Цитата(Karadul @ 18.6.2012,  01:35)
Ну любитель - не любитель, но пользуюсь. А какое лисп имеет отношение к яве в частности и к промышленной разработке вообще?

Common Lisp - вполне себе прямое.

http://www.lispworks.com/success-stories/index.html

http://www.franz.com/success/

Но ты отвлекаешься.

Автор: k0rvin 18.6.2012, 08:25
Цитата(Karadul @ 18.6.2012,  01:35)
Цитата(Pawl @  15.6.2012,  22:48 Найти цитируемый пост)
Код

for (int x : xs) {
    for (int y : ys) {
        sum += x + y;
        break;
    }
}

Там не вложенные for.

Зачем ты пропустил
Код

ys = copyOfRange(ys, 1, ys.length);

? =)

Но это конечно изврат.

Автор: Karadul 18.6.2012, 15:00
Цитата(k0rvin @  18.6.2012,  06:29 Найти цитируемый пост)
Но ты отвлекаешься. 

От чего? Мы о ФП говорили?

Так а что из себя представляют примеры, если не map+reduce?

Добавлено @ 15:05
Цитата(k0rvin @  18.6.2012,  06:29 Найти цитируемый пост)
Цитата(Karadul @ 18.6.2012,  01:35)
Ну любитель - не любитель, но пользуюсь. А какое лисп имеет отношение к яве в частности и к промышленной разработке вообще?

Common Lisp - вполне себе прямое.

http://www.lispworks.com/success-stories/index.html

http://www.franz.com/success/

Это типа как много на нем написано? А на яве этот список тебе браузер завесит smile


Цитата(Pawl @  15.6.2012,  22:48 Найти цитируемый пост)
Код

for (int y : ys) {
        sum += x + y;
        break;
}
ys = copyOfRange(ys, 1, ys.length);


Вот уж действительно изврат - из-за одного значения foreach вызывать и потом останавливать, так еще и с O(n**2). На govnokod.ru надо запостить.

Автор: k0rvin 18.6.2012, 15:53
Цитата(Karadul @ 18.6.2012,  15:00)
От чего?

От циклов foreach.

Цитата(Karadul @ 18.6.2012,  15:00)
Так а что из себя представляют примеры, если не map+reduce?

Простые циклы.

Цитата(Karadul @ 18.6.2012,  15:00)
Это типа как много на нем написано? А на яве этот список тебе браузер завесит smile

Это типа его используют в "энтерпрайзе", а мерятся количеством как-то не солидно.

Автор: Karadul 18.6.2012, 17:38
И чего в них не хватает?
Параллельной итерации по двум последовательностям? В питоне это решается так
Код

for x, y in zip(xs, ys):

Т.е. берется функция zip, которая возвращает выполнят на каждой последовательности next() и возвращает кортеж со значениями, потом этот кортеж распаковывается в x,y. Скорость такой операции жавоёидов может не устроить.
А как часто такое бывает надо? Ну в принципе можно бы было и сделать, но с консервативностью явы вряд ли, мож в дотнете бы появилось.

Цитата(k0rvin @  15.6.2012,  22:12 Найти цитируемый пост)

Код

int[] xs = new int[] { 1, 2, 3, 4, 5 };
int[] ys = new int[xs.length];
for (int x : xs, int &y : ys) { // & означает ссылку
  y = x*x;
}
// ys = { 1, 4, 9, 16, 25 }

Это уже какая-то полунизкоуровневая хрень. Для таких целей лучше подходит map или уже сишный for цикл.
Итерация через foreach с возможностью изменения элемента не всегда возможно, т.к. итерация может идти через последовательности, которые изменить нельзя в принципе (например, поток байтов из сокета или файла, открытого для чтения). Хотя для массивов, возможно бы, и пригодилась.
В сисярпе есть ref, может там что-то работает.

А вообще работа с итераторами хорошо получается через ФП. Может, в сисярпе linq решает часть этих проблем.

Цитата(k0rvin @  18.6.2012,  15:53 Найти цитируемый пост)
Это типа его используют в "энтерпрайзе", а мерятся количеством как-то не солидно. 

А яву где?
А количеством людей, пишущих на нем, солиднее?



Автор: Karadul 18.6.2012, 22:30
Модератор: Сообщение скрыто.

Автор: AntonSaburov 18.6.2012, 23:20
Тему закрываю - она уже ушла непонятно куда.

Автор: AntonSaburov 20.6.2012, 15:49
Возобновляем в разделе холиваров.

Автор: k0rvin 20.6.2012, 16:44
Цитата(Karadul @ 18.6.2012,  17:38)
Т.е. берется функция zip, которая возвращает выполнят на каждой последовательности next() и возвращает кортеж со значениями, потом этот кортеж распаковывается в x,y. Скорость такой операции жавоёидов может не устроить.

Угу, вот так и получается, что прожорливость софта идет в ногу с повышением производительности железа. Где-то на stackoverflow вроде уже было сравнение производительности C#/.NET foreach и for. Не в пользу foreach.

Добавлено через 2 минуты и 8 секунд
Цитата(Karadul @ 18.6.2012,  17:38)
А яву где?
А количеством людей, пишущих на нем, солиднее?

Ты спрашивал, использутеся ли CL где-то за пределами университетов (кстати, там он как раз не используется), я тебе ответил с примерами.

Никаким количеством не солидней.

Автор: Karadul 24.7.2012, 06:01
Батхертнутые модерашки мне бан на три недели выписали. Когда им уже руки поотпиливают.


Цитата(Karadul @  20.6.2012,  16:44 Найти цитируемый пост)
Т.е. берется функция zip, которая возвращает выполнят на каждой последовательности next() и возвращает кортеж со значениями, потом этот кортеж распаковывается в x,y. Скорость такой операции жавоёидов может не устроить.

Понятия не имею, зачем я это написал. Наверно, как пример, как это можно сделать.
В принципе, можно конечно же сделать foreach и с несколькими переменными, заодно решив, что делать с последовательностями разной длины. Но почему-то этого не сделали.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)