【问题标题】:How to pass to method TreeSet or HashMap and show it?如何传递给方法 TreeSet 或 HashMap 并显示它?
【发布时间】:2012-11-21 22:08:35
【问题描述】:

我有这样的方法:

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 方法中进行任何转换(这不是重点)。有什么想法吗?

【问题讨论】:

  • 为什么不创建两个方法,例如:show(TreeSet t)show(HashMap m)
  • @NullUserException:我知道我可以做到这一点,但我在某人的博客上读到它可能 - 但不知道如何做到这一点:)(没有代码示例)我只是想知道它是否真的有可能:)
  • 你可以结合这两种方法,但是要从map中获取key和value你需要知道它是一个map,所以你最终使用了instanceof。 @NullUserException 的评论中建议的两种显示方法更简单、更干净。
  • o.toString() 可以解决问题,除非您不喜欢默认格式。
  • 顺便说一句,如果你想知道集合或地图的内容是什么,你可以在上面调用System.out.println()。只是说。

标签: java collections hashmap treeset


【解决方案1】:

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

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

那么你可以这样使用它:

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

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

【讨论】:

  • -1 地图不可迭代 - 您不能将地图传递给此方法
  • @Bohemian True,但他没有将地图传递给该方法。
  • @NullUserException true,但这不是问题所要问的
  • @Bohemian 嗯,答案确实说 “不完全是你想要的,但 MapSet 本质上是不同的,你不能真正以同样的方式对待它们(多态)。”
  • @Bohemian 当然,但它(就像你说的那样)有点难看。我只会创建多个方法,然后让 Java 找出使用哪一个。
【解决方案2】:
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());
            }
        }

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      按照更接近面向对象的方法,您可以为 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
      }
      

      那么你只需要将你的可展示物包裹在你将使用的任何实际对象周围:

      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...)。

      【讨论】:

        猜你喜欢
        • 2020-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多