печать arraylist без скобок

1

Я пытаюсь отобразить свой вывод без скобок. Я чувствую, что это просто, но просто не могу понять.

Результат выглядит так:

22 ([1, 2, 11]) 
33 ([1, 3, 11]) 
44 ([1, 2, 4, 11, 22]) 
55 ([1, 5, 11]) 
66 ([1, 2, 3, 6, 11, 22, 33]) 
77 ([1, 7, 11]) 

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

22 (1, 2, 11) 
33 (1, 3, 11) 
44 (1, 2, 4, 11, 22) 
55 (1, 5, 11) 
66 (1, 2, 3, 6, 11, 22, 33) 
77 (1, 7, 11) 

Здесь часть моего кода

import java.util.ArrayList;

public class Palindrome {
    public static void main(String[] args) {
        int e = 0;
        // palindromic composite number
        int drome = 0;
        // starting int range
        int start = 10;
        // ending int range
        int end = 10000;
        for (int i = start; i <= end; i += 1) {
            if (isPalindromic(i)) {
                drome = i;
                if (!isPrime(i))
                    System.out.println(drome + " (" + getDivisors(drome) + ")");
            }
        }
    }

    // gets gets the divsors and adds them to arraylist if divsor is a
    // palindrome
    public static ArrayList getDivisors(int number) {
        ArrayList numbersDivisor = new ArrayList();
        int i = 0;
        for (i = 1; i < number; i++) {
            if (number % i == 0 && i != number && isPalindromic(i)) {
                numbersDivisor.add(i);
            }
        }
        return numbersDivisor;
    }
  • 0
    Сохраните результирующий ArrayList в переменной. Сохранить результат вызова toString в другой String . Обрежьте скобки из этой String и используйте ее для печати.
  • 0
    Простой взлом состоит в том, чтобы заменить все символы [ и ] на "" используя replaceAll . getDivisors(drome).toString().replaceAll("[\\[\\]]",""); Но это работает только потому, что ваша структура данных не включает в себя какие-либо String которые могут содержать реальные символы в квадратных скобках. Это не совсем общее решение.
Теги:

3 ответа

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

Вместо этого попробуйте использовать StringBuilder:

public static StringBuilder getDivisors(int number) {
    StringBuilder numbersDivisor = new StringBuilder();
    int i = 0;
    for (i = 1; i < number; i++) {
        if (number % i == 0 && i != number && isPalindromic(i)) {
            numbersDivisor.append(i).append(',');
        }
    }
    if(0 < (i = numbersDivisor.length())) {
        numbersDivisor.deleteCharAt(i - 1);//remove that last comma
    }
    return numbersDivisor;
}

ИЛИ

Вместо этого вы можете заменить скобки в main():

String divs = getDivisors(drome).toString().replace("\\[", "(").replace("\\]", ")");
System.out.println(drome + divs);

ИЛИ

Вы можете попробовать предложение @LuiggiMendoza.

1

Я думаю, что самым простым решением, вероятно, является изменение вашего метода, чтобы вернуть String,

public static String getDivisors(int number) {
    StringBuilder sb = new StringBuilder();
    for (int i = 1; i < number; i++) {
        if (number % i == 0 && i != number && isPalindromic(i)) {
            if (sb.length() > 0) {
                sb.append(", ");
            }
            sb.append(i);
        }
    }
    return sb.toString();
}

Кроме того, вы можете переписать результат неявного toString из List (пожалуйста, запрограммируйте интерфейс и, пожалуйста, не используйте необработанные типы), например

public static List<Integer> getDivisors(int number) {
    List<Integer> al = new ArrayList<>();
    for (int i = 1; i < number; i++) {
        if (number % i == 0 && i != number && isPalindromic(i)) {
            al.add(i);
        }
    }
    return al;
}

И тогда if (! IsPrime (i)) {String str = getDivisors (drome).toString(); str = str.substring(1, str.length() - 1); str = str.substring(1, str.length() - 1); System.out.println(drome + " (" + str + ")"); System.out.println(drome + "(" + str + ")"); } }

  • 1
    Вы не можете просто назначить List<Integer> для String переменной. Вам нужно сделать: String str = getDivisors(drome).toString(); ,
0

Метод System.out.println() использует метод toString() (глубоко внутри), чтобы печатать вещи для любых объектов, переданных в качестве параметров. Класс ArrayList наследует AbstractList который наследует класс AbstractCollection который переопределяет метод класса java.lang.Object toString(). Ниже приведена реализация метода toString() по умолчанию в классе AbstractCollection:

 public String toString() {
    Iterator<E> i = iterator();
    if (! i.hasNext())
        return "[]";

    StringBuilder sb = new StringBuilder();
    sb.append('[');
    for (;;) {
        E e = i.next();
        sb.append(e == this ? "(this Collection)" : e);
        if (! i.hasNext())
            return sb.append(']').toString();
        sb.append(", ");
    }
}

Создайте новый класс, который наследует класс ArrayList и переопределяет метод toString(). Прочтите встроенный комментарий с кодом:

public class BracketlessArrayList<E> extends ArrayList<E> {

 /**
 * For serialization.. ignore this
 */
private static final long serialVersionUID = 1L;

public String toString() {
             Iterator<E> i = iterator();
            if (! i.hasNext()){
                //return "[]";  //line removed to avoid square brackets
                 return "";
            }


             StringBuilder sb = new StringBuilder();
             //sb.append('[');  //line removed to avoid square brackets
             for (;;) {
                 E e = i.next();
               sb.append(e == this ? "(this Collection)" : e);
                 if (! i.hasNext()){
                     //line removed to avoid square brackets
                     //return sb.append(']').toString();  
                     return sb.toString();                         
                 }

                 sb.append(", ");
             }
         }
}

Теперь измените метод getDivisors() следующим образом:

public static BracketlessArrayList getDivisors(int number) {
    BracketlessArrayList numbersDivisor = new BracketlessArrayList();
    int i = 0;
    for (i = 1; i < number; i++) {
        if (number % i == 0 && i != number && isPalindromic(i)) {
            numbersDivisor.add(i);
        }
    }
    return numbersDivisor;
}

Это поможет вам правильно.

Ещё вопросы

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