【问题标题】:Java: Many-to-one bidirectional lookupJava:多对一双向查找
【发布时间】:2015-04-30 21:35:17
【问题描述】:

我有一个多对一关系的数据。我希望能够从两个方向查找数据。一个例子:

0 : a
1 : b
2 : b
3 : b
4 : c

get(0) --> a
get(1) --> b
get(a) --> 0
get(b) --> (1:3)

这有意义吗?有可能吗?

【问题讨论】:

  • 这没有意义。有可能
  • 左右侧项是同类型还是不同类型?
  • 在某些情况下这肯定有用,而且很有可能。您在创建可以执行此操作的数据结构时遇到什么问题? What have you tried?
  • @PatriciaShanahan - 是和不是。最终的数据类型是不同的——击键到最终字符。但是,如果我可以将索引映射到索引(int 到 int),我会没事的。
  • 你可以使用BiMap<String, List<Integer>>(BiMap 是番石榴的一部分)

标签: java dictionary hashmap


【解决方案1】:

这绝对是可能的。这是添加项目的代码片段:

Map<Integer,String> forwardMap = new HashMap<>();
Map<String,Set<Integer>> reverseMap = new HashMap<>();

void add(Integer x, String y) {
    forwardMap.put(x, y);
    if (!reverseMap.containsKey(y))
        reverseMap.put(y, new HashSet<Integer>());
    reverseMap.get(y).add(x);
}

脚注:Apache Commons 有 BidiMap,Google Guava 有 BiMap,但这些似乎是一对一的地图,不允许问题中提出的多对一情况。

【讨论】:

  • 我喜欢这个主意。我要玩弄它。
  • +1 通常,通过将两个或多个 java.util 集合与公开所需行为的包装器代码相结合,通常很容易构建专用集合。
【解决方案2】:

只需使用 2 个 hahsmap。为简单起见,假设您的 "one" 是 Integer 类型,而 "many" 是 String 类型。

HashMap<Integer, String> intToString = new HashMap<>();
HashMap<String, HashSet<Integer>> stringToInt= new HashMap<>();

链接元素的功能:

public void linkElements(Integer i, String s){
  intToString.add(i,s);
  stringToInt.get(s).add(i);
}

获取值是这样的:

intToString.get(0);    // returns "a"
stringToInt.get("b");  // returns a set {1,2,3}

【讨论】:

  • 你好。这是我的答案的重复,它不会增加讨论的价值
  • 我和你同时打字。显然你打字速度更快了——仍然给了你的赞成票。
  • 谢谢。顺便说一句,您需要在 stringToInt 映射中添加内容,否则 get(s) 将始终返回 null
  • 谢谢@aguibert。我当然也从您的回答中汲取了灵感。
【解决方案3】:

是的,使用 JPA(Java Persistence API),它将使您能够创建 @OneToMany,并且在子节点中,它将为您提供带有 @ManyToOne 的列表,基本上它将引用您的专利财产的财产。示例

public class Table1{
    @Id 
    int id ; 
    @OneToMany 
    List<Table2> ls ; 

   // getter and setter ...
}

public class Table2{
        @Id 
        int id ; 
        @ManyToOne 
        Table1 t1 ; 

       // getter and setter ...
    }

希望对你有所帮助

【讨论】:

  • 这不是数据库问题,他们只是想知道如何用 JavaSE 做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2021-07-10
相关资源
最近更新 更多