Я пытаюсь перестроить строку с помощью StringBuilder. Я немного не уверен в том, какой метод использовать для получения "", "вставлен обратно в одно и то же место". В приведенном ниже коде я использую метод "insert (int dstOffset, CharSequence s, int start, int end)". Мой код не содержит ошибок, однако он не работает должным образом.
Обратите внимание, что я также буду избегать символов (т.е. =) В строке, но я еще не написал эту часть кода. В настоящее время я пытаюсь узнать, как разбить строку, а затем перестроить ее.
благодаря
public class StringTestProgram
{
public static void main(String[] args)
{
String relativeDN = "cn=abc,dn=xyz,ou=abc/def";
String[] stringData = relativeDN.split(",");
for (String stringoutput : stringData)
{
System.out.print(stringoutput);
StringBuilder sb = new StringBuilder(stringoutput);
CharSequence charAdded = ",";
sb.insert(6,charAdded,0,12);
System.out.print(sb.toString());
}
}
}
Пересмотренный код
public class StringTestProgram {
public static void main(String[] args) {
String relativeDN = "cn=abc,dn=xyz,ou=abc/def";
System.out.println(relativeDN);
//Split String
String[] stringData = relativeDN.split(",");
{
StringBuilder sb = new StringBuilder();
CharSequence charAdded = ",";
// loop thru each element of the array
for (int place = 0; place < stringData.length; place++) {
System.out.println(stringData[place]);
{
int eq = relativeDN.indexOf('=');
String sub = relativeDN.substring(0, eq);
System.out.println(sub);
}
// append element to the StringBuilder
sb.append(stringData[place]);
// avoids adding an extra ',' at the end
if (place < stringData.length - 1)
// if not at the last element, add the ',' character
sb.append(charAdded);
}
System.out.print(sb.toString());
}
}
}
Я новичок в stackoverflow, и я не уверен, нормально ли задавать этот вопрос в этом потоке или я должен создать отдельный поток для этого вопроса. Если возможно, пожалуйста, сообщите.
Следующий код теперь разделяет строку на символ ",". Он также восстанавливает строку обратно в исходное состояние. Я также хотел бы использовать методы index и и.substring для получения строкового значения после знака "=". В настоящее время моя программа выводит только первые два символа исходного значения строки перед знаком "=". Не уверен, где в моем коде я делаю ошибку. Любая помощь будет оценена по достоинству.
Мой текущий выход cn = abc, dn = xyz, ou = abc/def cn = abc cn dn = xyz cn ou = abc/def cn cn = abc, dn = xyz, ou = abc/def
Требуемый выход cn = abc, dn = xyz, ou = abc/def cn = abc abc dn = xyz xyz ou = abc/def abc/def cn = abc, dn = xyz, ou = abc/def
Попробуйте этот код
public class StringTestProgram {
public static void main(String[] args) {
String relativeDN = "cn=abc,dn=xyz,ou=abc/def";
String[] stringData = relativeDN.split(",");
StringBuilder sb = new StringBuilder();
CharSequence charAdded = ",";
for (int i = 0; i < stringData .length; i++) { //walk over each element of the array
System.out.println(stringData[i]);
sb.append(stringData[i]); // append element to the StringBuilder
if (i < stringData.length - 1) //avoids adding an extra ',' at the end
sb.append(charAdded); // if not at the last element, add the ',' character
}
System.out.print(sb.toString());
}
}
Здесь вы будете восстанавливать исходную строку точно так, как она была (т.е. без добавления трейлинга ','):
cn=abc,dn=xyz,ou=abc/def
UPDATE: В цикле for я просто просматриваю каждый элемент массива, который хранит разделенную String и добавляет элементы в экземпляр StringBuilder один за другим. После добавления каждого элемента я проверю, находится ли мы в последнем элементе массива. Если нет, я добавляю символ ','.
Самый простой способ сделать эту предварительную Java 8 - использовать 1 StringBuilder для всех элементов и добавить Strings к строителю с помощью метода append()
StringBuilder builder = new StringBuilder();
for (String stringoutput : stringData) {
builder.append(stringoutput).append(',');
}
//have an extra trailing comma so remove it
//use length -1 as end coord because it exclusive
String result = builder.substring(0, builder.length() -1);
Если вы используете Java 8, вы можете использовать новый Stream API и Collectors.joining()
String result = Arrays.stream(relativeDN.split(","))
.collect(Collectors.joining(","));
substring
если вам не нужно? Это замедляет ваш код.
builder.toString()
и builder.substring()
оба вызывают new String(chararray, start, end)
. единственное различие между двумя вызовами состоит в том, каковы значения для начала и конца.
Вы инициализируете sb
каждый раз, когда вы вводите цикл, что означает, что вы удаляете свой StringBuilder
каждый раз, когда вы вводите цикл и воссоздаете его только с помощью следующего подстроки.
Исправлена:
String relativeDN = "cn=abc,dn=xyz,ou=abc/def";
String[] stringData = relativeDN.split(",");
StringBuilder sb = new StringBuilder();
CharSequence charAdded = ",";
for (String stringoutput : stringData) {
System.out.print(stringoutput);
sb.append(stringoutput).append(charAdded);
}
sb.setLength(sb.length() - 1);
System.out.print(sb.toString());
,
что вы уходите в конце
Как это:
for (String stringoutput : stringData)
sb.append(stringoutput).append(',');
Исправлено: используя этот подход, вам нужно будет удалить последнее ,
String result = sb.toString().substring(0,sb.toString().length()-1);
System.out.println(result);
,
в конце вывода. Это не то, чего хочет ОП.
,
В других ответах я заметил, что в конце будет дополнительная запятая. Вы должны использовать префиксную переменную, а затем изменить ее в цикле, чтобы не было дополнительной запятой.
String relativeDN = "cn=abc,dn=xyz,ou=abc/def";
String[] stringData = relativeDN.split(",");
StringBuilder sb = new StringBuilder();
String prefix = "";
for (String element : stringData) {
sb.append(prefix);
prefix=",";
sb.append(element);
}
String output = sb.toString();
Внутри цикла добавляется префикс, но в первый раз через цикл префикс устанавливается на пустые кавычки, так что перед первым элементом не будет запятой. Следующий префикс заменяется на запятую, так что при следующем прохождении цикла после первого элемента будет добавлена запятая. Наконец, элемент добавляется. Это приводит к правильному выводу, потому что запятая добавляется перед элементом, но только после первой итерации.