2014-03-30 50 views
1

我有一個類似的類:如何調用toString()在/不同的實現/類的java等

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()來獲得我想要的成員。

回答

1

如果你已經在使用番石榴,這可以懶洋洋地在一個線

return Iterables.toString(this); 

做......不做不必要的副本。

+0

這就是機票!現在我們已經有了java8,也許toString可以是Iterable中的默認方法? – Eyal

0

你至少在做什麼並不是「錯誤的」。這個列表是明確構建的,可以用一個小的實用方法來避免,但是很少有像這樣的事情很重要的情況。

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

由於您使用的番石榴已,試試這個:

StringBuilder sb = new StringBuilder("["); 
Joiner.on(",").appendTo(this, sb); 
return sb.append("]").toString(); 

它會做很多與您的電話,但不進行復制。

相關問題