如何传递给方法TreeSet或HashMap并显示它



我有这样的方法:

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

我想传递给它树集或哈希图。但这是一个不同的迭代,我的意思是,当我想显示 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?我无法在显示方法中进行任何转换(这不是重点)。有什么想法吗?

不是直接的,而是如果你的方法声明为:

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

然后你可以像这样使用它:

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

不完全是你想要的,但MapSet本质上是不同的,你不能真正以同样的方式对待它们(多态)。

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

答案是肯定的,但有点难看:

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

遵循更紧密的面向对象方法,您可以为类 TreeSet 和 HashMap 创建装饰器。然后,而不是调用show(object),你将调用object.show(),恕我直言,它更干净,遵循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
}

因此,您只需将可显示对象包裹在要使用的任何实际对象周围:

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

或者,如果您只想打印任何可显示的内容,则可以:

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

你可以为任何东西创建这些装饰器 - 可迭代,列表,集合等......然后使用依赖注入来使用你碰巧使用的任何集合实现(可迭代,列表...)。

最新更新