【问题标题】:Java: Trying to print out data contents of a List<Integer>, but only get pointer addressJava:尝试打印 List<Integer> 的数据内容,但仅获取指针地址
【发布时间】:2012-02-05 21:52:26
【问题描述】:
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);
}

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

【问题讨论】:

  • 试试JOptionPane.showMessageDialog(null, text.getText());

标签: java list arraylist


【解决方案1】:

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

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");
}

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

【讨论】:

  • 显然不是。我不知道这是可能的。它不会改变我的错误信息。这导致“JTextArea 类型中的方法 append(String) 不适用于参数 (Integer)”
  • @user1191205 你需要使用i.toString()
  • 奇怪我猜它不会隐式调用toString() - 编辑
  • OP 实现迭代器的模式比你的建议更好。在 Java 中引入了 for each 循环之后,它当然已经过时了。但是在我们需要使用迭代器的情况下,它应该像 OP 写的那样完成。除了你的答案假设 OP 知道每个循环是什么之外,我认为如果他知道它,它将被使用。
  • @user1191205 - Java 6 中添加了“for-each”循环。很方便 :)
【解决方案2】:

你为什么要那样做?

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();
}

【讨论】:

  • 如果正在创建总线,则意味着您并不孤单。
【解决方案3】:

假设您想使用迭代器,您需要获取 next 值并打印它,而不是您正在执行的迭代器 itslef。类似的东西

//create an iterator, then
while (it.hasNext()) {
   text.append(it.next());
   ...
}

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

【讨论】:

    【解决方案4】:

    试试这个:

    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);
    }
    

    【讨论】:

      【解决方案5】:

      您的问题是 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-21
        • 2021-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多