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);
}
如何修改它以使其实际打印数据内容而不是指针地址?
答案 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());
}