我有一个类似的课程:
class MyClass implements Iterable<Set<String>> {
@Override
public Iterator<Set<String>> iterator() {
//Lots of code here
}
@Override
public String toString() {
return ImmutableList.copyOf(this).toString();
}
}
它正确实现了Iterable<Set<String>>
。对于toString()
,我想将其显示为List<Set<String>>
。到目前为止,我的解决方案如上所述。有没有更好的方法来做到这一点,还是这是正确的方法?私有成员变量是输出迭代器的状态的一部分,但是没有一个成员可以调用toString()
来获得我想要的东西。
答案 0 :(得分:1)
由于您已经使用过番石榴,请尝试以下方法:
StringBuilder sb = new StringBuilder("[");
Joiner.on(",").appendTo(this, sb);
return sb.append("]").toString();
它与你的通话几乎完全相同,但没有制作副本。
答案 1 :(得分:1)
如果您已经使用过番石榴,可以在一行中懒散地完成这项工作
return Iterables.toString(this);
......没有做出不必要的复制。
答案 2 :(得分:0)
你在做什么不是&#34;错误&#34;至少。列表是明确构造的,可以通过一个小的实用方法来避免,但很少有这样的事情真的很重要。
class IteratorToString
{
public static <T> String toString(Iterator<T> iterator)
{
if (!iterator.hasNext())
{
return "[]";
}
StringBuilder sb = new StringBuilder();
sb.append('[');
while (true)
{
T t = iterator.next();
sb.append(t);
if (!iterator.hasNext())
{
return sb.append(']').toString();
}
sb.append(',').append(' ');
}
}
}