LINUX.ORG.RU

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

 


0

3

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

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

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

★★★★★

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

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

И чего ж я там увижу такого удивительного? Применительно к сим двум методам:

indexOf:

String

indexOf(String str) Returns the index within this string of the first occurrence of the specified substring.

List

indexOf(Object o) Returns the index of the first occurrence of the specified element in this list, or -1 if this list does not contain the element.

contains:

String

contains(CharSequence s) Returns true if and only if this string contains the specified sequence of char values.

Collection

containsAll(Collection<?> c) Returns true if this collection contains all of the elements (а не sequence == порядок не важен) in the specified collection.

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

Еще прочитай, там несколько методов indexOf 8), а заодно дай телефон насяльника, ему надо знать что у него такие экземпляры работают.

contains:

этот метод по сути обертка над indexOf(elemet) > -1, тяжелое наследие затейливой иерархии интерфесов коллекций, и амозглия от увлечения ООП

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

Еще прочитай, там несколько методов indexOf 8),

Второго (который с начальной позицией поиска) один фиг в коллекциях нету. Или еще будем считать отдельно поиск примитива, делающий ровно то же самое, но существующий только для того, чтобы этот самый примитив туда-сюда в строку не гонять?

этот метод по сути обертка над indexOf(elemet) > -1

containsAll для коллекций - не совсем так прост.

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

Второго (который с начальной позицией поиска) один фиг в коллекциях нету.

Не, пусь Ваш работодатель с Вами мучается, это ему будет наказание.

containsAll для коллекций - не совсем так прост.

Предлагаю еще, пока не кончилась трава, затребовать реализации split для Collection с использованием регулярок.

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

Ну какие возражения, тыж таки нашел метод с 10 раза, теперь у тебя осталось одно отличие containsAll с сложнейшей реализацией:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/...

Но это я оставлю на твоей совести 8(

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

я чего-то не припомню, чтобы мы на «ты» переходили, уважаемый.

отличие containsAll от чего? от стрингового? см. выше - игнорирование последовательности элементов.

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

Имеется ввиду что int operator + (int b) это не частья языка?

operator+() это часть языка, но этот оператор ничего не значит, и компилятор скажет, что он не может посчитать x+y, если ты не написал operator+(). Операторы только для встроенных типов работают.

drBatty ★★
()
Ответ на: комментарий от drBatty
class Integer
{
private:
    int value;
public:
    Integer(int i): value(i) 
    {}
    const Integer operator+(const Integer& rv) const {
        return (value + rv.value);
    }
};

Это не сработает, чтоли?

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

Ты просто не помнишь что и с кем пил.

отличие containsAll от чего? от стрингового?

И не помнишь о чем речь, похоже даже исходный код читать не можешь.

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

А чем плох split?

StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead.

http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html

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

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

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

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

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

в коллекциях это не работает для аргумента-«подколлекции», в отличие от.

разжевываю снова для летящих в высях: ежели сравнивать «по функциям», то indexOf и contains методы стринга принимают аргументом строку и ищут ее же - последовательность элементов, а не один элемент или множество. Большими буквами, по слогам: ПО-СЛЕ-ДО-ВА-ТЕЛЬ-НОСТЬ. Отличие уже качественное, изкоробочные Collections так не умеют.

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

Технически контейнер, идеологически - нет.

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

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

А чем плох split?

split - это регэкспы. Оно медленнее. Плюс, токенайзеру можно сказать возвращать разделители вместе с разделенными элементами строки - иногда надо, а как это провернуть со сплитом - я хз.

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

Это не сработает, чтоли?

сработает. Тут ты определил Integer::operator+() через сложение двух int. Но это твоя идея, в C++ такого не было.

drBatty ★★
()

Что такое java? Если язык, то нету, если платформа то есть.

public static void main(String []args) {
        testOver();
    }

    public static void testOver() {
        String s = "testString";
        System.out.println(s);
        for (int i=0; i < s.length(); i++) {
            printf("%d=%s\n", i, s[i]);
        }
        BigInteger i = 89 *893428 * Math.random();
        i *= i^12
        System.out.println("" + i);
    }
C:\Java\x64\jdk1.6.0\bin\java xxx bootstrap.InitDomainScript
Connected to the target VM, address: '127.0.0.1:57693', transport: 'socket'
testString
0=t
1=e
2=s
3=t
4=S
5=t
6=r
7=i
8=n
9=g
6289833413740864
Disconnected from the target VM, address: '127.0.0.1:57693', transport: 'socket'
vtVitus ★★★★★
()
Последнее исправление: vtVitus (всего исправлений: 1)
Ответ на: комментарий от arkhnchul

split - это регэкспы. Оно медленнее.

Зато гибче и удобней. В 99% пофиг на те микросекунды, затраченные на компиляцию регэкспа, к тому же он кешируется, насколько я помню. Выполняется он достаточно быстро. В том 1%, когда этот split находится где-нибудь в середине цикла из миллиарда итераций, можно и оптимизировать.

Плюс, токенайзеру можно сказать возвращать разделители вместе с разделенными элементами строки - иногда надо, а как это провернуть со сплитом - я хз.

Когда надо, тогда используй. Мне надо почти всегда тупо по запятым разделить контент, например, или по табам и всё.

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

напиши свой(что автор и сделал подчёркивая возможности платформы) которая догрузила String своим методом [] и поменяла видимости так , что теперь в сырце String это автора.String

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

к тому же он кешируется, насколько я помню

в String.split() - емнип нет. Есть Pattern, его можно (нужно) .compile, он шустрее шевелится.

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

Есть Pattern, его можно (нужно) .compile, он шустрее шевелится.

вру, так же.

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

Да, и вполне логично иметь декоратор для таких целей. Например есть гуавский Lists.charactersOf

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

Да, кстати, String.split сам определяет, надо ли использовать регэкспы и если в переданном паттерне регэкспа не наблюдается, то использует тот самый indexOf без компиляции.

А паттерн действительно не кешируется, почему то думал, что Pattern.compile может вернуть закешированный инстанс.

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

Забавно, но все же это иной язык)

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

Зато гибче и удобней. В 99% пофиг на те микросекунды, затраченные на компиляцию регэкспа, к тому же он кешируется, насколько я помню.

Ага, у потом мы видим отакое:

https://github.com/maxcom/lorsource/blob/master/src/main/java/ru/org/linux/ut...

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

И что тут не так? Желательно с конкретными цифрами, сколько по-твоему времени в день тратит сервер ЛОР-а на (ненужную) компиляцию этих регэкспов в сравнение с «оптимизированным» вариантом и какие конкретно профиты получит команда лора от того, что оптимизирует данный участок кода.

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

И что тут не так?

Тут не так зашкаливающее количество шлангов.

Deleted
()
30 июля 2013 г.
Ответ на: комментарий от pylin

ничего.

вот это посмотри

ТамГдеJava/jdk?.?.?_??/src/java/lang/String.java

полезно

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