Как перестроить строку с помощью StringBuilder?

1

Я пытаюсь перестроить строку с помощью 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

  • 0
    Просто хотел бы поблагодарить всех за то, что они предоставили несколько ответов на мой вопрос, а также нашли время, чтобы объяснить код. Ваша помощь была и очень ценится.
Теги:
string
substring
stringbuilder
indexof

5 ответов

0
Лучший ответ

Попробуйте этот код

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 один за другим. После добавления каждого элемента я проверю, находится ли мы в последнем элементе массива. Если нет, я добавляю символ ','.

  • 0
    Этот код дает мне вывод, который я искал. Если это не так много, можете ли вы объяснить, что происходит в заявлении for?
  • 0
    @Papitulo уверен, смотрите обновление к ответу. Я также добавил больше комментариев к коду. Если вам нужна дополнительная помощь, пожалуйста, дайте мне знать.
Показать ещё 2 комментария
3

Самый простой способ сделать эту предварительную 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(","));
  • 0
    Зачем вам substring если вам не нужно? Это замедляет ваш код.
  • 1
    @ martijnn2008 нет, это не так. builder.toString() и builder.substring() оба вызывают new String(chararray, start, end) . единственное различие между двумя вызовами состоит в том, каковы значения для начала и конца.
Показать ещё 1 комментарий
2

Вы инициализируете 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()); 
  • 0
    Вы забываете , что вы уходите в конце
  • 0
    Исправлено, теперь последний ',' отбрасывается
0

Как это:

for (String stringoutput : stringData) 
    sb.append(stringoutput).append(',');

Исправлено: используя этот подход, вам нужно будет удалить последнее ,

String result = sb.toString().substring(0,sb.toString().length()-1);

System.out.println(result);
  • 0
    Теперь у вас также есть , в конце вывода. Это не то, чего хочет ОП.
  • 0
    Правда. Я исправил это, удалив последний ,
0

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

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();

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

  • 0
    Этот код также дает желаемый результат. Не могли бы вы объяснить, что делает код с оператором for?
  • 0
    @Papitulo Я редактировал свой пост, надеюсь, это поможет! :)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню