Я пытаюсь отобразить свой вывод без скобок. Я чувствую, что это просто, но просто не могу понять.
Результат выглядит так:
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;
}
Вместо этого попробуйте использовать 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.
Я думаю, что самым простым решением, вероятно, является изменение вашего метода, чтобы вернуть 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 + ")"); } }
List<Integer>
для String
переменной. Вам нужно сделать: String str = getDivisors(drome).toString();
,
Метод 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;
}
Это поможет вам правильно.
ArrayList
в переменной. Сохранить результат вызоваtoString
в другойString
. Обрежьте скобки из этойString
и используйте ее для печати.[
и]
на""
используяreplaceAll
.getDivisors(drome).toString().replaceAll("[\\[\\]]","");
Но это работает только потому, что ваша структура данных не включает в себя какие-либоString
которые могут содержать реальные символы в квадратных скобках. Это не совсем общее решение.