StringBuilder.insert()

Мне нужно сравнить две строки.

Входное значение похоже на

SELECT * FROM ds WHERE ds.age='24';

Текст, с которым его нужно сравнить,

SELECT * FROM ds WHERE ds.status='VALID' AND ds.age='24';

Поскольку "ds.status='VALID' AND" является статической строкой, я подумал о том, чтобы вставить ее во входные данные, а затем сравнить с исходной строкой.

Поэтому я создал объект StringBuilder и

query.insert(query.indexOf("ГДЕ"), "ds.status='ДЕЙСТВИТЕЛЬНО' И");

но выход был

SELECT * FROM ds ds.status='VALID' AND WHERE ds.age='24';

Кроме того, indexOf() нельзя вводить со статической позицией, поскольку она может меняться в зависимости от ввода. Есть ли способ найти индекс последней буквы слова «ГДЕ»?

Обходной путь, который я нашел, это

String query = query.replace("ГДЕ", "ГДЕ ds.status='ДЕЙСТВИТЕЛЬНО' И");

Это лучший возможный метод?


person aradhak    schedule 12.06.2012    source источник
comment
почему бы просто не добавить количество букв --› indexOf(WHERE)+6   -  person Asaf    schedule 12.06.2012
comment
Я бы использовал замену, но с пробелами query.replace(" WHERE ", " WHERE ds.status='VALID' AND ");   -  person Peter Lawrey    schedule 12.06.2012


Ответы (3)


Я думаю, что замена намного чище и легче читается - как комментарий Питера Лоури:

query.replace(" WHERE ", " WHERE ds.status='VALID' AND ");

Не нужно беспокоиться об ошибках ограждения или магических числах, и это намного яснее в намерениях!

ИЗМЕНИТЬ

Это было бы:

query.toString().replace(" WHERE ", " WHERE ds.status='VALID' AND ");

(Замена на StringBuilder требует индексов)

person plasma147    schedule 12.06.2012
comment
Хорошо, поэтому я думаю, что мне лучше пойти с replace(). Спасибо всем. :) Но я определенно хотел бы узнать, почему insert() выдает StringIndexOutOfBoundsException. Есть мысли по этому поводу? - person aradhak; 12.06.2012
comment
Согласно javadoc, исключение StringIndexOutofBoundsException возникает, когда смещение является недопустимым. Я не понимаю, как это могло бы произойти при запуске query.insert(query.indexOf("WHERE"), "ds.status='VALID' AND"); на SELECT * FROM ds WHERE ds.age='24';, возможно ли, что вы запустили код в строке, которая не содержала WHERE ? - person plasma147; 12.06.2012

Вы можете сделать что-то вроде этого -

    StringBuffer str = new StringBuffer("SELECT * FROM ds WHERE ds.age='24'");
    str.insert(str.lastIndexOf("WHERE") + 6, "ds.status='VALID' AND ");
person Pramod Kumar    schedule 12.06.2012

person    schedule
comment
Не совсем. Замените query.indexOf("WHERE" + "WHERE".length()) на query.indexOf("WHERE") + "WHERE".length() или даже лучше: query.indexOf("WHERE") + 5 - person Boris Strandjev; 12.06.2012
comment
добавьте пробелы, иначе получится SELECT * FROM ds WHEREds.status='VALID' ANDds.age='24'; ;) - person Hachi; 12.06.2012
comment
@Hachi устанавливает пробел перед вставкой строки. - person plucury; 12.06.2012
comment
q.insert(query.indexOf(WHERE) + 5, ds.status='VALID' AND); дает java.lang.StringIndexOutOfBoundsException: индекс строки вне диапазона: исключение 22. Из этого я понимаю, что в соответствии с java строка не имеет длины 22 символа. Но SELECT * FROM ds WHERE ds.age='24'; содержит 22 символа! - person aradhak; 12.06.2012
comment
@Студент, что такое q? Я думаю, вам следует использовать query. - person plucury; 12.06.2012
comment
О да, плюкурий, вы правы. Поскольку я не могу редактировать комментарий, query.insert(query.indexOf("WHERE") + 5, " ds.status='VALID' AND"); дает java.lang.StringIndexOutOfBoundsException: String index out of range: 22 exception. Из этого я понимаю, что в соответствии с java строка не имеет длины 22 символа. Но SELECT * FROM ds WHERE ds.age='24'; содержит 22 символа! - person aradhak; 12.06.2012
comment
@Student Итак, у вас все еще есть ошибка? Как насчет того, чтобы показать мне больше кодов? - person plucury; 12.06.2012