2015-10-27 2 views
0

Вопрос Java.Java - toString неправильно печатает массив

Я хотел, чтобы распечатать массив с методу String, , но все это я получаю это:

[email protected] 
[email protected] 

Я знаю, что это указывает на точку, где массивы сохраняются, но как Я на самом деле распечатываю массивы с помощью метода toStinr?

import java.util.ArrayList; 

public class Fifo { 

    private ArrayList <Object> list; 

    public Fifo() { 
     this.list = new ArrayList <Object>(); 
    } 

    public void push(Object obj) { 
     list.add(obj); 
    } 

    public ArrayList getList() { 
     return this.list; 
    } 

    public Object pull() { 
     if (list.isEmpty()) { 
      System.out.println("leer"); 
      return null; 
     } 
     Object o = list.get(0); 
     list.remove(0); 
     return o; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (o == this) 
      return true; 
     if (o.getClass() == this.getClass()) { 
      Fifo other = (Fifo) o; 
      ArrayList otherList = other.getList(); 

      if (otherList.size() == this.getList().size()) { 
       boolean sameObjects = true; 
       for (int i = 0; i < list.size(); i++) { 
        if (!list.get(i).equals(otherList.get(i))) { 
         sameObjects = false; 
        } 
       } 
       if (sameObjects) 
        return true; 
      } 
     } 
     return false; 
    } 

    public Fifo clone() { 
     Fifo cloneObj = new Fifo(); 

     for (int i = 0; i < this.list.size(); i++) { 
      cloneObj.push(this.list.get(i)); 
     } 
     return cloneObj; 
    } 
} 

Это индивидуальный метод для тестирования:

import java.util.*; 

public class Aufgabe { 

    public static void main(String [] args){ 
     Fifo test = new Fifo(); 
     Fifo test2; 

     test.push(1234); 
     test.push("Hallo"); 
     test.push(5678); 
     test.push("du da"); 

     test.pull(); 

     System.out.println(test.toString()); 
     test2=test.clone(); 
     System.out.println(test2.toString()); 
     System.out.println(test2.equals(test)); 
    } 
} 
+0

Вы не отметили вопрос на каком-либо языке. Я предполагаю, что это Java? – Mureinik

+0

Да, извините, это! – marvin

+0

Вы переопределили метод toString() в своем классе Fifo? – Christopher

ответ

2

Во-первых, вы не используете массив, вы используете ArrayList - это РЕАЛИЗАЦИЯ List в Java.

Во-вторых, вы не распечатываете список массивов, вы печатаете объект, содержащий его - экземпляр Foo.

Fifo test = new Fifo(); 
// do stuff 
System.out.println(test.toString()); 

Если вы просто хотите, чтобы распечатать список, вам нужно использовать

Fifo test = new Fifo(); 
// do stuff 
System.out.println(test.getList()); 

приятнее решение было бы переопределить toString в классе Foo.

public class Foo { 
    // everything you already have 

    public String toString() { 
    // you can format this however you want 
    return "Contents of my list: " + list; 
    } 
} 

Этот метод будет затем автоматически вызывается при передаче объекта в System.out.println.

Foo test = new Foo(); 
// do stuff 
System.out.println(test); 

приведет к Contents of my list: [a, b, c] (где a, b, c на самом деле все, что у вас есть в списке).

Дополнительная информация При использовании System.out.println в Java, помните:

  • примитивы будут напечатаны, как они, например, System.out.println(1) будет печатать 1 и System.out.println(false) распечатать false.
  • Объектные экземпляры (то есть непримитивы) будут иметь метод toString(), вызываемый println.
  • По умолчанию toString объекта [email protected].
  • По умолчанию toString одномерного массива - [[email protected]. Дополнительные размеры приведут к дополнительному [ в начале строки.
+0

Лучший ответ. Спасибо! – marvin

1

Массивы в Java являются объектами, которые не переопределяют метод toString(), так, как вы отметили, вы получите реализацию по умолчанию, которая содержит имя класса и хэш-код [default] hashCode(). Для того, чтобы «правильно» преобразовать массив в строку, вы можете использовать Arrays.toString:

MyObject[] array = ...; 
System.out.println(Arrays.toString(array)); 
0

Используйте это:

Arrays.toString(yourArray); 

Что ToString напечатает за массив будет содержать хэш-код, тип элементов массива, поэтому не совсем то, что вы ищете

0

переопределите Object.toString() и дайте свою реализацию, которая будет работать нормально.

+0

Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий ниже своего сообщения - вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно [репутации] (http://stackoverflow.com/help/whats-reputation), вы будете быть в состоянии [прокомментировать любое сообщение] (http://stackoverflow.com/help/privileges/comment). – Phani

+0

Спасибо, я новичок в этом форуме, и я понимаю пополам. –

+0

@Phani на самом деле это (хотя бы часть) правильный ответ, поэтому комментарий был бы неуместным – Vogel612

0

Как упоминалось выше, используйте Arrays.toString() способ.

Далее в

[email protected] 
[email protected] 

Это как toString() метод, определенный в классе Object работ. Он печатает строку следующего формата:

[email protected] 

Это реализация по умолчанию, определенная в классе Object. Поскольку ваш класс FIFO не переопределяет метод toString(), вызов toString() в ваших объектах FIFO вызывает метод toString() в классе Object.

0

Вам необходимо переопределить toString()в вашем Fifo классе, чтобы распечатать что-то полезное. Возможно, что-то вроде этого будет вполне подходящим:

@Override 
public String toString() { 
    return "Fifo" + list.toString(); 
} 

(. Это даст вам что-то вроде Fifo[element1, element2])

Смежные вопросы