Java:尝试打印出List <integer>的数据内容,但只获取指针地址</integer>

时间:2012-02-05 21:52:26

标签: java list arraylist

public static void printFib(List<Integer> fib){
    JTextArea text = new JTextArea();
    for(Iterator<Integer> it = fib.iterator(); it.hasNext(); it.next() ){
        text.append(it.toString());
        text.append("\n");
    }
    JOptionPane.showMessageDialog(null,text);
}

如何修改它以使其实际打印数据内容而不是指针地址?

5 个答案:

答案 0 :(得分:3)

你真的需要一个交互者吗?

for (Integer i : fib)
{
    text.append(i.toString());
    text.append("\n");
}

如果由于某种原因你需要一个迭代器用于其他东西,那么你将它用作:

Iterator<Integer> it = fib.iterator();
while (it.hasNext())
{
    text.append(it.next().toString());
    text.append("\n");
}

修改:总结下面的评论; OP不是通过Integer获取it.next()迭代器,而是调用迭代器的toString()方法并接收包含迭代器哈希码的十六进制表示的String

答案 1 :(得分:1)

为什么你这样做呢?

for (Integer i : fib) {
    text.append(i.toString());
    text.append("\n");
}

无论如何,您要追加it(不是it.next())。您正在打印迭代器,而不是正在迭代的内容。


如果我这样做,我可能会写这样的方法; YMMV:

public static void printFib(List<Integer> fib){
    StringBuilder sb = new StringBuilder();
    for (Integer i : fib) {
        sb.append(i).append("\n");
    }

    JTextArea text = new JTextArea(sb.toString());
    JOptionPane.showMessageDialog(null, text);
}

实际上,我可能会这样做,但他们为像我这样的人制作特殊的小巴士:

public static void main(String[] args) {
    List<Integer> fib = Arrays.asList(1, 2, 3);
    display(buildFibOutput(fib));
}

private static void display(String s){
    JTextArea text = new JTextArea(s);
    JOptionPane.showMessageDialog(null, text);
}

private static String buildFibOutput(List<Integer> fib) {
    StringBuilder sb = new StringBuilder();
    for (Integer i : fib) {
        sb.append(i).append("\n");
    }
    return sb.toString();
}

答案 2 :(得分:0)

假设您要使用迭代器,您需要获取next值并打印它,而不是它正在执行的迭代器itlef。像

这样的东西
//create an iterator, then
while (it.hasNext()) {
   text.append(it.next());
   ...
}

虽然你可以使用for循环,但我认为在上下文中可能更容易理解while循环......

答案 3 :(得分:0)

试试这个:

public static void printFib(List<Integer> fib){
    JTextArea text = new JTextArea();
    for(Integer it : fib){
        text.append(it.toString());
        text.append("\n");
    }
    JOptionPane.showMessageDialog(null,text);
}

答案 4 :(得分:-1)

你的问题是text是JTextArea实例。将其传递给JOptionPane.showMessageDialo(null,text);文本后,称为方法toString(),由Object超类型传递。要解决此问题,您需要将该text实例的内容传递给该方法。要做到这一点,只需调用方法getText(),并应该工作。

除了改进您的代码:

我不知道方法append是如何工作的,但是一个好的做法是使用StringBuilder类来减少对不可变String个对象的操作。由于它们是不可变的,当你需要连接那些你正在创建新的一个对象时,所以循环的每次传递都会创建新的对象。另一件事是你使用过时的方法,用于List迭代。由于foreach loop已经在Java中引入,因此应该使用它来代替您实现的模式。 for each循环可用于实现接口Iterable的所有元素,因此代码的改进版本如下所示:

public static <T> void print(Iterable<T> iterable){

    if(iterator == null) { //We throw an exception if method can not operater
       throw new IllegelArgumentException("The argument iterable must not be null".
    }

    StringBuilder sb = new StringBuilder();

    for(T element : iterable) { //for each loop
       sb.apppend(String.valueOf(element)); 
       sb.append("\n");
    }

    JOptionPane.showMessageDialog(null,sb.toString());
}

另外method is generic