Java 如何传递到方法TreeSet或HashMap并显示它?

Java 如何传递到方法TreeSet或HashMap并显示它?,java,collections,hashmap,treeset,Java,Collections,Hashmap,Treeset,我有这样的方法: public void show(Object o) { //show content of object } 我想传递给它TreeSet或HashMap。但这是一个不同的迭代,我的意思是,当我想显示TreeSet的内容时,我使用该代码: while ( iter.hasNext() ) { System.out.println( iter.next()); } 但当我有一张HasMap时,我会这样打印: Iterator iterato

我有这样的方法:

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);  
} 
show(set);
show(map.entrySet());

当我不知道用户是否通过树集或HashMap时,是否有方法显示集合的内容?我不能在show方法中进行任何转换(这不是重点)。有什么想法吗?

不直接,但如果您的方法声明为:

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

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

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

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);
    }
}
公共静态无效显示(对象o){
if(o Iterable的instanceof){//包括集合、列表等
for(对象元素:(Iterable)o){
系统输出打印项次(元素);
}
}else if(o映射实例){
对于(Map.Entry:((Map)o.entrySet()){
System.out.println(entry.getKey()+“”+entry.getValue());
}
}如果(o!=null&&o.getClass().isArray()){
//如何检测和处理阵列
for(对象元素:(对象[])o){
系统输出打印ln(o);
}
}否则{
//默认情况
系统输出打印ln(o);
}
}

遵循更接近面向对象的方法,您可以为类TreeSet和HashMap创建装饰器。然后,您将调用object.show(),而不是调用show(object),它更干净,并且遵循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
}
可显示的公共界面{
void show();
}
公共类ShowableTreeSet扩展TreeSet实现Showable
{
私人TreeSet代表;
公共可展示树集(树集代表){
this.delegate=委托;
}
公开展览({
代表(E:代表){
系统输出打印ln(e);
}
}
公共布尔加法(E){
返回委托。添加(e);
}
//所有其他委托方法
}
公共类ShowableHashMap扩展了HashMap实现了Showable
{
私有HashMap委托;
公共ShowableHashMap(HashMap委托){
this.delegate=委托;
}
公开展览({
迭代器迭代器=delegate.keySet().Iterator();
while(iterator.hasNext()){
字符串键=迭代器.next().toString();
字符串值=delegate.get(key.toString();
System.out.println(键+“”+值);
} 
}
公共整数大小(){
返回delegate.size();
}
//所有其他委托方法
}
因此,您只需将可展示内容包装在您将使用的任何实际对象周围:

ShowableTreeSet<String> sts = new ShowableTreeSet<String>(new TreeSet<String>());
sts.show();
ShowableTreeSet sts=newshowabletreeset(newtreeset());
sts.show();
或者,如果您想要任何可显示的打印输出,您可以:

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

您可以创建这些装饰器来处理任何事情-可编辑、列表、集合等等。。。然后使用依赖注入来使用您碰巧使用的任何集合实现(Iterable,List…)。

为什么不创建两个方法,例如:
show(TreeSet)
show(HashMap m)
?@NullUserException:我知道我可以这样做,但我在一些人的博客上读到这是可能的,但不知道如何做:)(没有代码示例)我只是想知道这是否真的有可能:)您可以将这两种方法结合起来,但是要从映射中同时获得键和值,您需要知道它是一个映射,因此最终使用instanceof。@NullUserException的注释中建议的两个show方法更简单、更清晰。
o.toString()
可以做到这一点,除非您不喜欢默认格式。顺便说一句,如果您只想知道集合或映射的内容是什么,您可以对它们调用
System.out.println()
。只是说。-1地图是不可编辑的-你不能把地图传给这个method@Bohemian是的,但他没有向该方法传递映射。@NullUserException是的,但这不是问题所在asks@Bohemian答案是这样的“不完全是你想要的,但是
Map
Set
本质上是不同的,你不能用同样的方式(多态性)对待它们。”@Bohemian当然,但它(就像你说的)有点难看。我只会创建多个方法,让Java知道使用哪个方法。
Showable showable = new ShowableTreeSet<String>(new TreeSet<String>());
showable.show();