LINUX.ORG.RU

строки и оператор []

 


0

3

Если я правильно читал документацию и учебник, то получается так написать дял строк нельзя:
str[2];

Доступ по [] не поддерживается ни строкамми, ни в инфрастуктуре коллекций. Если я правильно понимаю, то в частности это связано с тем что в java нельзя перегрузить оператор. Допустим, но почему тогда не внести изменение в компилятор, то есть по каким мотивам такой способ доступа не поддерживается? Или все поддерживается, а я все не так понял ?

Просто в С\С++ есть, в паскале есть, питоне есть, а в java нет, неясно почему

★★★★★

Последнее исправление: pylin (всего исправлений: 1)

Это главная проблема java?

В scala есть перегрузка, а также много других полезных вещей.

note173 ★★★★★
()

Доступ по [pos] не поддерживается ни строкамми,

str.charAt(pos)

спроси у Гослинга отчего такой десигндесмшн(проектное решение)

http://docs.oracle.com/javase/tutorial/index.html

это была «их» попытка отделить случайный доступ( для необязательно эффективно для любой реализации последовательности) от последовательности.

хочеш индексацию? либо StringBuilder либо str.toCharArray

qulinxao ★★☆
()

Если я правильно читал документацию и учебник, то получается так написать дял строк нельзя: str[2];

Нельзя.

Доступ по [] не поддерживается ни строкамми, ни в инфрастуктуре коллекций. Если я правильно понимаю, то в частности это связано с тем что в java нельзя перегрузить оператор. Допустим, но почему тогда не внести изменение в компилятор, то есть по каким мотивам такой способ доступа не поддерживается? Или все поддерживается, а я все не так понял ?

В Java четкое разделение между примитивными типами и классами. У классов никакой магии нет, с объектом можно сделать ровно одну вещь — использовать оператор "." для вызова метода или обращения к полю класса. Все остальные операторы связаны с примитивными типами или массивами.

Одно исключение — оператор «+» (и +=) применим к классу String.

Хорошо это или плохо — есть разные точки зрения и разные языки по-разному подходят к этому. Могу сказать, что большой проблемы отсутствие перегрузки операторов не вызывает.

Лично моё мнение — в Java следовало бы сделать встроенные перегрузки арифметических операций для классов типа BigInteger и перегрузку [] для List и CharSequence аналогично тому, как перегрузка + сделана для String. В общем, чтобы в своем коде использовать нельзя было, а для библиотечных классов можно. Но не сделали.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от note173

Это главная проблема java?

Конечно нет, просто [] удобная конструкция для произвольного доступа,но в язык не включена была, интересно знать почему

str.charAt(pos)

Это все же иная конструкция, хотя выполняет аналогичные задачи

В чем вопрос? Почему java не похожа Паскаль? О чем думал Гослинг N лет назад?

Почему java непохожа на паскаль как раз понятно, непоянтна мотивация исключения стандарьной конструкции seq[pos]. Документ интересный, но на вопрос не отвечает

pylin ★★★★★
() автор топика
Ответ на: комментарий от Legioner

Лично моё мнение — в Java следовало бы сделать встроенные перегрузки арифметических операций для классов типа BigInteger и перегрузку [] для List и CharSequence аналогично тому, как перегрузка + сделана для String. В общем, чтобы в своем коде использовать нельзя было, а для библиотечных классов можно. Но не сделали.

Согласен с вашим мнением, спасибо за подробный комментарий

pylin ★★★★★
() автор топика
Ответ на: комментарий от pylin

String-это класс,а не массив символов,или ссылок.

Делай char[] и обращайся к ниму используя свой []

Что не ясно?

anonymous
()
Ответ на: комментарий от Legioner

В Java четкое разделение между примитивными типами и классами. У классов никакой магии нет, с объектом можно сделать ровно одну вещь — использовать оператор "." для вызова метода или обращения к полю класса. Все остальные операторы связаны с примитивными типами или массивами.

Бред какойто.

ДЛя работы с классами существует масса операторов,а не только один.

anonymous
()
Ответ на: комментарий от anonymous

Ну по поводу одного погорячился, а масса это какие? Присваивание, сравнение ссылок, приведение. Что еще?

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Все операторы применимы к классам,включая [].

anonymous
()

Это выдуманная проблема. Поиндексный доступ - штука довольно редкая. А вот последовательный перебор частая.

dizza ★★★★★
()
Ответ на: комментарий от Legioner

несколько раздражает такая мелочь как одноимённость свойства length у массивов и метода length() у String

т.е по «интерфейсам» это одна сущьность(число элементов ) Но фактический протокол различен ( свойство(ридонлиполе)VS(нульарный)метод)

Java писалась и продолжает поддерживатся для «общеочевидных» способов - уменьшее стоимости обучения очень важна.

qulinxao ★★☆
()

Просто в С\С++ есть

в C нет. ВНЕЗАПНО, это сахар для указателя.

В C++ тоже нет, есть перезагрузка в STL.

drBatty ★★
()
Ответ на: комментарий от pylin

начнём с того , что String в жабке есть set-once value поэтому страшно отдавать:

s[pos] - это что и это где?

почему так , а не иначе ? видимо подталкивают «хочеш жонгрировать символами юзай их массив или StringBuilder»

qulinxao ★★☆
()
Ответ на: комментарий от pylin

При разработке java изначально решили, что перегрузка операторов - плохая фича и поэтому решили её не делать. Про плюсы и минусы перегрузки можешь почитать в вики.

Так исторически сложилось.

actics
()
Ответ на: комментарий от actics

В C++ тоже нет, есть перезагрузка в STL.

Можешь пояснить?

по дефолту этот оператор ничего не означает, и его надо как-то перезагружать. Не обязательно, что как индекс. Хотя в std::vector оно уже перезагружено, где-то там внутри STL.

drBatty ★★
()
Ответ на: комментарий от actics

При разработке java изначально решили, что перегрузка операторов - плохая фича и поэтому решили её не делать

Да они просто боялись, что быдлокодерам не справиться будет.

anonymous
()
Ответ на: комментарий от pylin

Вот такие вот язык и платформа. Исторически сложилось, что новые возможности в стандартный рантайм вносятся годами (JCP), а синтаксис — практически десятилетиями. И тому есть причины.

note173 ★★★★★
()
Ответ на: комментарий от drBatty

Что же здравого в такой философии? «Не дадим удобный инструмент, а то вдруг себе навредите». Ладно хоть в скалке есть :)

anonymous
()
Ответ на: комментарий от anonymous

Что же здравого в такой философии? «Не дадим удобный инструмент, а то вдруг себе навредите».

типа того. Можешь посмотреть, во что вылилась философия «дадим всё и всем!» например в C++. Единственное, что меня радует, так это то, что большинство не в курсе, что new тоже можно перезагрузить, и юзают дефолт. C++ допускает говнокод, который непонятно как работает, и тем не менее - _работает_. Это разве хорошо?

drBatty ★★
()
Ответ на: комментарий от drBatty

Это допускает любой язык. На яве можно писать работающий быдлокод гораздо легче и удобнее, чем на С++. А вот что-то удобное и полезное на яве сделать практически невозможно. Шарп и тот лучше. Но мой выбор - scala.

С++, кстати, инструмент хороший, только былокодеров к нему на пушечный выстрел подпускать нельзя. И слава Богу, они из него уходят(на явашарпы как раз, в основном).

anonymous
()
Ответ на: комментарий от anonymous

Угу, у нас же илиту нечем больше занять, кроме как борьбой с инструментами вместо полезной работы.

dizza ★★★★★
()
Ответ на: комментарий от anonymous

Это допускает любой язык. На яве можно писать работающий быдлокод гораздо легче и удобнее, чем на С++.

понимаешь в чём сложность: зависит от твоих хотелок. Если ты не хочешь писать быдлокод, то на C++ ты его всё равно напишешь, просто по незнаию тонкостей ЯП. А если хочешь - да, ничто не поможет.

Но мой выбор - scala.

ну ещё-бы…

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

других кодеров тупо нет.

drBatty ★★
()
Ответ на: комментарий от Deleted

Ага, и почему для строк нет итератора?

Аналогично [] - а оно там надо? Весьма редко бывает нужно работать посимвольно (если очень хочется, то toCharArray() и вперед), обычно таки требуется нечто более осмысленное.

arkhnchul ★★★
()
Ответ на: комментарий от dizza

Ну унутрях же он контейнер, да и снаружи никто не мешал - тем боле что во многих языках так и есть.

Deleted
()
Ответ на: комментарий от arkhnchul

если очень хочется, то toCharArray()

Который делает копию массива символов, ага.

обычно таки требуется нечто более осмысленное.

Обычно это у потомственных индусов юзающих регулярку чтобы разделить строки по запятой?

Deleted
()
Ответ на: комментарий от Deleted

Обычно это у потомственных индусов юзающих регулярку чтобы разделить строки по запятой?

у них тоже, да.

ЗЫ для запятой есть StringTokenizer

arkhnchul ★★★
()
Ответ на: комментарий от arkhnchul

Мысли шире - у String все теже методы что и у Collection, только модифицирующих нет, в унутрях у нее массив. По сути это иммутабельный ArrayList примитивов.

Т.е. еслиб не идиотское деление на примитвы и обертки то разницы вообщебы не было

Deleted
()
Ответ на: комментарий от arkhnchul

ЗЫ для запятой есть StringTokenizer

На до на собеседованиях про него спрашивать, а то про него никто не знает, хорошо многие догадываются indexOf(',') юзать, вместо идиотского split, еще более умный догадываются накидать утилиту split\join или заюзать чтонить из готовых сторонних библиотек

хотя, нет, я вспомнил там же enumeration - это нельзя юзать

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от dizza

Ни С++, ни Scala не вынуждают бороться с ними. Это просто более сложные инструменты, требующие большей глубины знаний и понимания. Нравится, когда вам не доверяют мощный инструментарий - пожалуйста. Но не надо это расспространять на всех.

anonymous
()
Ответ на: комментарий от Deleted

Ты только догадайся сравнивать их по функциям а не по имени, ладно? Например length() -> size()

собственно, length и toCharArray. Все. Еще charAt() и substring(), если пойти до List-а.

arkhnchul ★★★
()
Последнее исправление: arkhnchul (всего исправлений: 1)
Ответ на: комментарий от arkhnchul

собственно, length и toCharArray. Все

Бгг, толстый толстый троллинг. Вы забыл isEmpty, indexOf и contains это все что работает в иммутабельной в коллекции

Deleted
()
Ответ на: комментарий от pylin

по моему ничего .

по Гослингу&Ко - нужно листать их талмуд где они просвещают новообращённых писать аплеты для интернета.

qulinxao ★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.