3

私はそのような方法を持っています:

public void show(Object o)
{
   //show content of object
}

そして、それに TreeSet または HashMap を渡したいと思います。しかし、それは別の繰り返しです。つまり、TreeSet のコンテンツを表示したい場合は、そのコードを使用します。

 while ( iter.hasNext() )
    {
      System.out.println( iter.next());
    }

しかし、HasMap がある場合は、次のように出力します。

Iterator iterator = map.keySet().iterator();  

while (iterator.hasNext()) {  
   String key = iterator.next().toString();  
   String value = map.get(key).toString();  

   System.out.println(key + " " + value);  
} 

ユーザーが TreeSet または HashMap を渡すかどうかわからないときに、コレクションの内容を表示する方法はありますか? show メソッドで変換を行うことはできません (それは重要ではありません)。何か案は?

4

4 に答える 4

4

直接ではありませんが、メソッドが次のように宣言されている場合:

public <T> void show(Iterable<T> iterable) {
  for(T t: iterable) {
    System.out.println(t);
  }
}

次に、次のように使用できます。

show(set);
show(map.entrySet());

正確にはあなたが望むものではありませんがMapSet本質的に異なり、実際にそれらを同じように(多形的に)扱うことはできません。

于 2012-11-21T22:12:46.283 に答える
1
if (o instanceof Map) {
            HashMap map = (HashMap) o;
            Iterator iterator = map.keySet().iterator();

            while (iterator.hasNext()) {
                String key = iterator.next().toString();
                String value = map.get(key).toString();

                System.out.println(key + " " + value);
            }
        } else if (o instanceof Set) {
            TreeSet tree = (TreeSet) o;
            Iterator iter = tree.iterator();
            while (iter.hasNext()) {
                System.out.println(iter.next());
            }
        }
于 2012-11-21T22:13:36.063 に答える
1

答えはイエスですが、少し醜いです:

public static void display(Object o) {
    if (o instanceof Iterable) { // includes Sets, Lists etc
        for (Object element : (Iterable<?>) o) {
            System.out.println(element);
        }
    } else if (o instanceof Map) {
        for (Map.Entry<Object, Object> entry : ((Map<Object,Object>) o).entrySet()) {
            System.out.println(entry.getKey() + " " + entry.getValue());
        }
    } else if (o != null && o.getClass().isArray()){
        // How to detect and handle arrays
        for (Object element : (Object[])o) {
            System.out.println(o);
        }
    } else {
        // default case
        System.out.println(o);
    }
}
于 2012-11-21T22:17:02.473 に答える
0

より厳密なオブジェクト指向アプローチに従って、クラス TreeSet および HashMap のデコレータを作成できます。次に、show(object) を呼び出す代わりに、object.show() を呼び出します。これはよりクリーンな IMHO であり、カプセル化や抽象化などの OOP 原則に従います。

public interface Showable {
    void show();
}

public class ShowableTreeSet<E> extends TreeSet<E> implements Showable
{
    private TreeSet<E> delegate;

    public ShowableTreeSet(TreeSet<E> delegate) {
        this.delegate = delegate;
    }

    public void show() {
        for (E e : delegate) {
            System.out.println(e);
        }
    }

    public boolean add(E e) {
        return delegate.add(e);
    }

//all other delegate methods
}

public class ShowableHashMap<K, V> extends HashMap<K, V> implements Showable 
{
    private HashMap<K, V> delegate;

    public ShowableHashMap(HashMap<K, V> delegate) {
        this.delegate = delegate;
    }

    public void show(){
        Iterator<K> iterator = delegate.keySet().iterator();  

        while (iterator.hasNext()) {  
           String key = iterator.next().toString();  
           String value = delegate.get(key).toString();  

           System.out.println(key + " " + value);  
        } 
    }

    public int size() {
        return delegate.size();
    }

//all other delegate methods
}

したがって、使用する実際のオブジェクトの周りに showable をラップする必要があります。

ShowableTreeSet<String> sts = new ShowableTreeSet<String>(new TreeSet<String>());
sts.show();

または、印刷用の Showable だけが必要な場合は、次のようにします。

Showable showable = new ShowableTreeSet<String>(new TreeSet<String>());
showable.show();

これらのデコレーターを、Iterable、List、Collection など、ほぼすべてのものに作成してから、依存性注入を使用して、たまたま使用する Collection (Iterable、List...) の実装を使用できます。

于 2012-11-21T23:00:56.447 に答える