我创建了一个由两部分组成的组合键:mainID和sendaryID.当我需要插入一个值时,我希望能够同时使用这两个部分.但是,我希望能够以两种方式检索值:1)使用这两个部分仅返回一个值;2)仅使用mainID返回具有该mainID的值的列表.
我已经在下面的代码中实现了2).然而,它看起来并不有效.有没有更好的方法来做这件事?
非常感谢!
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
Map<CompositeId, String> map = new HashMap();
map.put(new CompositeId("1", "1"), "val1");
map.put(new CompositeId("1", "1"), "val2");
map.put(new CompositeId("1", "2"), "val3");
map.put(new CompositeId("2", "1"), "val4");
// is there any way to do this more efficiently? //
List<String> listValsWithMainIdEqualsOne = new ArrayList();
List<CompositeId> listIdsWithMainIdEqualsOne = map.keySet().stream().filter(k -> k.getMainId().equals("1")).toList();
listIdsWithMainIdEqualsOne.forEach(k -> listValsWithMainIdEqualsOne.add(map.get(k)));
//////////////////////////////////////////////////
assert map.get(new CompositeId("1", "1")).equals("val2");
assert map.get(new CompositeId("1", "2")).equals("val3");
assert listValsWithMainIdEqualsOne.contains("val2");
assert listValsWithMainIdEqualsOne.contains("val3");
}
}
class CompositeId {
private String mainId;
private String secondaryId;
public CompositeId(String mainId, String secondaryId) {
this.mainId = mainId;
this.secondaryId = secondaryId;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CompositeId compositeId = (CompositeId) o;
if (!this.mainId.equals(compositeId.getMainId())) return false;
if (compositeId.getSecondaryId() != null && !this.secondaryId.equals(compositeId.getSecondaryId())) return false;
return true;
}
@Override
public int hashCode() {
return (mainId + secondaryId).hashCode();
}
public String getMainId() {
return mainId;
}
public String getSecondaryId() {
return secondaryId;
}
}