java中如何在map中实现一对多的关系?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中如何在map中实现一对多的关系?相关的知识,希望对你有一定的参考价值。
假设我这样定义:
Map coll=new HashMap();
coll.put(1,"a");
coll.put(1,"b");
比如说1代表学校,a和b分别代表学院,即一个学校可对应多个学院。
请问我该如何取出a和b呢?
谢谢大家。
请问可否为我详细写出用另一种方法实现的代码呢?
2、key值可以为一个整型数,作为一个类似ID主键来使用,value值可以用List集合来保存多条数据
3、这样就达到了一个key,对应多条记录。 参考技术A map里存放的是键值对,键不可以重复 所以不能想里所说的那样实现一对多的关系,一对多关系主要体现在数据库里,通过主键或外键的组合来实现。你在程序里用map实现,好像没多大意义,如果真想实现这样的一对多关系可以这样 map 里面的值放一个集合 集合里面放各个学院。 参考技术B 可以实现,不过要自定义一个高级HashMap,它的效率是高出list很多。
下面是我以前写的一个sampler,试试看:(它不但可以操作基本数据类型,一般的对象也能,只要重写其hashcode和equals方法)
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
class Test
public static void main(String[] args)
Map<Object, Object> map = new fuzzyMap(new HashMap())
@Override
public Collection instanciateNewCollection()
return new ArrayList<Object>(3);
;
O o = new O("a1", "b1");
map.put(o, o);
O o2 = new O("a1", "b2");
map.put(o2, o2);
System.out.println(o.equals(o2));
o = new O("a3", "b3");
map.put(o, o);
o = new O("a4", "b4");
map.put(o, o);
Object o_return = map.get(o2);
if (o_return instanceof List)
List<O> localList = (List<O>) o_return;
for (O o_ret : localList)
System.out.println(o_ret.a + "===" + o_ret.b);
else
O o_ret = (O) o_return;
System.out.println(o_ret.a);
class O
public String a = "";
public String b = "";
public boolean hashCodeDirty = true;
private int hashCode = 1;
public O(String str1, String str2)
a = str1;
b = str2;
@Override
public int hashCode()
if (this.hashCodeDirty)
final int prime = 5;
int result = 1;
result = prime * result + ((this.a == null) ? 0 : this.a.hashCode());
this.hashCode = result;
this.hashCodeDirty = false;
return this.hashCode;
@Override
public boolean equals(Object obj)
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final O other = (O) obj;
if (this.b == null)
if (other.a != null)
return false;
else if (!this.a.equals(other.a))
return false;
return true;
abstract class fuzzyMap implements Map
private Map map;
public fuzzyMap(Map map)
super();
this.map = map;
public int size()
return map.size();
public boolean isEmpty()
return map.isEmpty();
public boolean containsKey(Object key)
return map.containsKey(key);
public boolean containsValue(Object value)
return map.containsValue(value);
public Object get(Object key)
return map.get(key);
public Object put(Object key, Object value)
Object v = map.get(key);
if (v != null)
if (v instanceof List)
((List) v).add(value);
else
Collection list = instanciateNewCollection();
list.add(v);
list.add(value);
map.put(key, list);
else
return map.put(key, value);
return v;
public abstract Collection instanciateNewCollection();
public Object removeValue(Object key, Object value)
Object v = map.get(key);
if (v != null)
if (v instanceof List)
((List) v).remove(value);
return value;
else if (value.equals(v))
remove(key);
return value;
return null;
return null;
public Object remove(Object key)
return map.remove(key);
public void putAll(Map t)
map.putAll(t);
public void clear()
map.clear();
public Set keySet()
return map.keySet();
public Collection values()
return map.values();
public Set<java.util.Map.Entry> entrySet()
return map.entrySet();
希望能帮助到你 参考技术C 你的就把一个学校作为一个集合对象,集合对象里面可以放多个院校。。
Map里面的key 就是你的学校,Value就只它对应的院校的集合对象。。
Map<String,List<T>> hashMap =new HashMap<String,List<T>>
List<T> list = new List<T>
hashMap.put("1",list) 参考技术D //楼主以下方法可以
Map<String,List> coll = new HashMap<String,List>();
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
coll.put("1",list);
List<String> results = (List<String>)coll.get("1");本回答被提问者采纳
在 MySQL 中实现一对一关系时确定外键
【中文标题】在 MySQL 中实现一对一关系时确定外键【英文标题】:Deciding on foreign key while implementing one to one relationship in MySQL 【发布时间】:2013-05-27 15:16:44 【问题描述】:我有两个简单的表“项目”和“订单”。为简单起见,我们假设一件商品只能在一个订单中,或者一个订单只能包含一件商品。
现在因为这可以使用简单的一对一关系来实现,所以我可以执行以下操作:
我可以将订单表的主键添加到项目表中,如下所示
//Table Items
item_id, item_name, order_id
1, shoes, 1
2, watch, 2
//Table Orders
order_id, customer
1, James
2, Rick
或者我可以将项目表的主键添加到订单表中,如下所示
//Table Items
item_id, item_name
1, shoes
2, watch
//Table Orders
order_id, customer, item_id
1, James, 1
2, Rick, 2
哪一个是正确的,为什么?是否有任何指导方针来决定哪把钥匙放在哪里?当然,常识在上面的简单示例中会起作用,但在复杂示例中我们如何决定?
【问题讨论】:
【参考方案1】:一对一 关系通常应该简单地合并到一个表中。如果没有任何矛盾,一对一关系可能是未考虑决定的标志。
如果你真的想使用这种关系,完全取决于你把 FK 放在哪里。在应用 FK 时,您可能需要考虑可选性。但是,在 MySQL 中,它仍然不是真正的一对一关系,因为那里不支持延迟键。
【讨论】:
同意。但随后它们将不再是一对一的关系,它们将成为自我参照关系。 @JayBhatt 如果我理解正确,我在这里看不到自引用关系。您是在询问一般原则还是仅针对此特定问题的解决方案? @JayBhatt 如果没有延迟外键(MySQL 不支持),您根本无法与两个表建立“一对一”关系。您可以拥有的最好的是“一到零或一” - FK 的位置决定了哪一边是哪一边。如果您想要真正的“一对一”,则必须在一张桌子上进行。 一些一对一的关系属于 IS-A 变体,与此问题中给出的示例不同。 IS-A 关系通常是对象建模中称为类/子类的模式的示例,在 ER 建模中称为泛化/专业化。在这种情况下,像class-table-inheritance 那样拆分表通常很有用 我们遇到了类似的问题 我们的问题是事务和位置具有一对一的关系。位置包含交易发生地点的信息。经过进一步分析,我们得出结论,Location与Transaction有关,并不独立存在。在某种程度上,这就像一个子实体。因此,我们在 Location 表中使用了事务的外键。以上是关于java中如何在map中实现一对多的关系?的主要内容,如果未能解决你的问题,请参考以下文章