【问题标题】:How to construct a hashtable of dynamic type如何构造动态类型的哈希表
【发布时间】:2013-12-06 06:50:50
【问题描述】:

我有一个函数,它有 2 个不同类型的列表作为参数输入。为了优化,我想创建一个最小列表类型的 HashSet / Hashtable(它们中的任何一个)。 java有没有办法在运行时决定type of Set

当前代码:

   public static void innerJoinHash(List<SportsMan> sportsMans, List<Sport> sportList) {
        if (sportsMans.size() < sportList.size()) {
            Set<SportsMan> set = new HashSet<SportsMan>();
        } else {
            Set<Sport> set = new HashSet<Sport>();
        }
    }

我想做什么:

public static void innerJoinHash(List<SportsMan> sportsMans, List<Sport> sportList) {
    Set< // some magic //> set       
       if (sportsMans.size() < sportList.size()) {
         set = new HashSet<SportsMan>();
    } else {
        set = new HashSet<Sport>();
    }
}

【问题讨论】:

  • 您是否有特别的原因想要这样做?为什么你不能做一些逻辑测试,选择正确的集合类型,然后继续使用超类型?
  • 您能详细说明一下吗?您正在创建 Set&lt;SportsMan&gt;Set&lt;Sport&gt; 但您想用它做什么?所有通用的Set 操作都可用于其中任何一个。
  • 对不起各位 - 编辑了我的问题
  • 你没有回答这个问题:这个集合创建后你会做什么?您的代码创建了一个集合并将其丢弃。
  • 我会用它来做一个更大的集合的连接操作。

标签: java hashmap runtime hashset


【解决方案1】:

您可以尝试使用 Java 泛型。 Set&lt;E&gt; customSet=new HashSet&lt;E&gt;();

这是您可以在运行时使用分配数据类型的一种方式。

  public static void innerJoinHash(List<SportsMan> sportsMans, List<Sport> sportList) {
  Set set = new HashSet();  
  if (sportsMans.size() < sportList.size()) {
        set.addAll(sportsMans)
    } else {
        set.addAll(sportList);
    }
  }

【讨论】:

  • @Santosh 我认为这就是他正在寻找的答案
  • 这是使用原始的Set,当你使用泛型时使用它没有意义。
  • 为什么要使用innerJoinHash(List&lt;SportsMan&gt; sportsMans, List&lt;Sport&gt; sportList)。为什么不简单地innerJoinHash(List sportsMans, List sportList)
  • @Santosh 你可以随心所欲,我只是改变 Set what ask by OP
  • @Santosh 我同意你所说的。根据我的回答。为什么要使用泛型。 Set 不会给你买任何东西。
【解决方案2】:

您正在寻找的“// some magic //”是SportSportsMan 的最具体的常见超类型。即,如果两个类都实现或扩展了一个公共接口,则可以使用它。否则为Object:

Set<Object> set = new HashSet<>(
    sportsMan.size() < sportsList.size()
    ? sportsMan : sportsList);

【讨论】:

    【解决方案3】:

    创建 Set as Object 的类型,并在运行时检索您始终可以将对象转换为所需的数据类型。

    public static void innerJoinHash(List<SportsMan> sportsMans, List<Sport> sportList) {    
           if (sportsMans.size() < sportList.size()) {
          Set set = new HashSet<SportsMan>();
        } else {
           Set set = new HashSet<Sport>();
        }
    }
    

    【讨论】:

      【解决方案4】:

      也许我不明白你的问题,但是这种方法有什么问题?

          Set myset = new HashSet();
          myset.add("Hello");
          myset.add(new Long(1));
      

      如果您使用 Set 或 Set 将其简化,您将无法获得泛型的任何好处。

      【讨论】:

        猜你喜欢
        • 2011-02-27
        • 1970-01-01
        • 2011-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多