Хранение StringBuffer

#java

#java

Вопрос:

В моем классе есть StringBuffer, который удаляет определенные символы, если выполняются условия в инструкции IF, и печатает инструкцию. Однако это может повторяться много раз. Если выполнено второе условие, первая инструкция будет распечатана БЕЗ удаления символов.

Есть ли способ обойти это? Ниже приведен мой код.

     if (status == 1 amp;amp; item == item1[1]){
        item1[1] = "*"; 
        w = sb1.append(item1[1] "[" item2[1] "] ");
        sb1.delete(1,4);
    }else if (status == 1 amp;amp; item == item1[2]){
        item1[2] = "*";
        x = sb1.append(item1[2] "[" item2[2] "] ");
        sb1.delete(1,4);
    }else if(status == 1 amp;amp; item == item1[3]){
        item1[3] = "*";
        y = sb1.append(item1[3] "[" item2[3] "] ");
        sb1.delete(1,4);   
    }  
    return w.toString() x.toString() y.toString() z.toString();
  

Чего я пытаюсь достичь, так это следующего:
У меня есть toString, который состоит из:

элемент1[1] «[«элемент2[1]»] » элемент1[2] » [» tem2[2] «]»

Я хочу сделать это:

если элемент1 помечен как принятый, он будет изменен на «*» и удалит элемент2[1] и [ ] вокруг него, а затем вернет его как:

      eg: item1[2] = x 
         item2[2] = 1


    * x[1]

( * used to be item1[1] )
  

но если циклы повторяются, мой текущий класс выполняет это:
*[] *[1]
я хочу, чтобы это было:
* *
Когда цикл завершен

Комментарии:

1. В чем проблема вашего кода?

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

3. Вопрос не ясен. Непонятен код. Пожалуйста, приведите пример ввода и ожидаемых результатов.

4. Мне кажется, вам не нужны w, x, y (, z), поскольку все они содержат только ссылку на sb1. На самом деле вы возвращаете sb1 четыре раза (если z также содержит ссылку на sb1)

5. Насколько я могу видеть, вы присваиваете sb1 значениям w, x, y . Вы пробовали запускать свой proram в отладчике, чтобы посмотреть, что он делает?

Ответ №1:

Общая проблема: item выглядит как String , item[] как String[] . Не используйте == со строками, иногда это приведет к неожиданному результату. Используйте equals() вместо:

 if (status == 1 amp;amp; item.equals(item1[1])) {
  

Используйте этот шаблон и для других условных проверок.

(и добавьте тест / обработчик, для item == null которого сейчас было бы необходимо)


Другое улучшение: замените StringBuffer на StringBuilder и не объединяйте строки при передаче их в append. Не для исправления ошибки, а для повышения производительности:

  w = sb1.append(item1[1]).append("[").append(item2[1]).append("] ");
  

Ответ №2:

Ваш код выглядит подозрительно. Давайте проведем трехкратную проверку, является ли ‘status == 1’ (есть ли скрытое логическое значение в переменной, которое пытается выйти?). И добавьте немного свежего воздуха между токенами, чтобы упростить задачу по их разделению для глаз:

 if (status == 1)
{
    if (item.equals (item1[1])) 
    {
        item1[1] = "*"; 
        w = sb1.append (item1[1]   "["   item2[1]   "] ");
        sb1.delete (1, 4);
    } 
    else if (item.equals (item1[2]))
    {
        item1[2] = "*";
        x = sb1.append (item1[2]   "["   item2[2]   "] ");
        sb1.delete (1, 4);
    }
    else if (item.equals (item1[3])) 
    {
        item1[3] = "*";
        y = sb1.append (item1[3]   "["   item2[3]   "] ");
        sb1.delete (1, 4);   
    }
}  
return (w.append (x). append (y). append (z)).toString ();
// 
  

Похоже, что 3 раза одно и то же утверждение, просто повторяется через 1,2,3 и w, x, y. Я также использовал append в последней строке и просто поместил ‘toString ()’ в конечный результат.

Давайте создадим цикл из 3 инструкций:

 if (status == 1)
{
    for (int i = 1; i < 4;   i)
    {
        if (item.equals (item1[i])) 
        {
            item1[i] = "*"; 
            w = sb1.append (item1[i]   "["   item2[i]   "] ");
            sb1.delete (1, 4);
        }
    }
}  
return (w.append (w). append (w). append (w)).toString ();
  

В зависимости от вашего кода, побочных эффектов, потоков и так далее, это может привести к чему-то другому, но я так не думаю. Особенно я не знаю, что такое w, x, y по умолчанию, если они не назначены в этой части кода. И код выглядит так, как будто элемент либо равен item1[1], либо item1[2], либо исключительно item1[3]. Но это может быть равно всем 3, и тогда цикл будет выполняться 3 раза вместо 1 раза.

Однако item1 / item2 — это запах кода. Это пахнет как 2-тусклый массив или плохо продуманная ориентация объекта (item.color, item.name или что-то в этом роде).