Java 如何检查ArrayList特定元素的唯一性
我有一个叫做LineUp的类,它是一个叫做Event的类的ArrayList。一个事件有三个值:一个字符串Act、一个地点(它自己的类)和一个int会话 事件可以这样声明。 事件e1=新事件(“Foo战斗机”,北舞台,“1”) LineUp是一个ArrayList,事件是像e1这样的元素 在我的LineUp类中,我必须生成一个不变量来检查ArrayList列表中包含的每个事件是否具有唯一的地点和会话。由于本次任务要求我严格遵守规范,因此与Act、场馆和会议的组合是否唯一无关,为了遵守规范,我必须/仅/确保场馆和会议是唯一的 如何在ArrayList中检查重复项但仅检查特定值Java 如何检查ArrayList特定元素的唯一性,java,arraylist,duplicates,Java,Arraylist,Duplicates,我有一个叫做LineUp的类,它是一个叫做Event的类的ArrayList。一个事件有三个值:一个字符串Act、一个地点(它自己的类)和一个int会话 事件可以这样声明。 事件e1=新事件(“Foo战斗机”,北舞台,“1”) LineUp是一个ArrayList,事件是像e1这样的元素 在我的LineUp类中,我必须生成一个不变量来检查ArrayList列表中包含的每个事件是否具有唯一的地点和会话。由于本次任务要求我严格遵守规范,因此与Act、场馆和会议的组合是否唯一无关,为了遵守规范,我必须
谢谢。如果我理解正确,您可以在方法中使用Map来存储值
Map<Map<Venue, Integer>, Act> lineup = new HashMap<>();
Map-lineup=newhashmap();
它结合了场馆会话对的独特性
然而,由于Venue是您自己的类,您必须为Venue实现equals()和hashCode()方法,才能使此解决方案工作
编辑:
我的意思是这样的:
Map<Map<Integer, Venue>,String> uniqueMap = new HashMap<>();
for (Event event: events) { // assuming events is ArrayList
Map<Integer, Venue> sessionVenueMap = new HashMap<>();
sessionVenueMap.put(event.getSession(), event.getVenue());
//check if we stored this pair in our cool map
if (uniqueMap.get(sessionVenueMap) == null) {
//if not
//store this in our uniqieMap in our method
uniqueMap.put(sessionVenueMap, event.getAct);
sessionVenueMap.put(event.getSession(), event.getVenue);
} else {
// if map has this pair
// then it is not unique
return false;
}
venueSessionMap.put(.getVenue(); event.getSession();
}
return true;
Map uniqueMap=newhashmap();
对于(Event:events){//假设events是ArrayList
Map sessionVenueMap=newhashmap();
sessionVenueMap.put(event.getSession(),event.getVenue());
//检查我们是否在酷地图中存储了这对
if(uniqueMap.get(sessionVenueMap)==null){
//如果不是
//将其存储在我们方法中的uniqieMap中
uniqueMap.put(sessionVenueMap,event.getAct);
sessionVenueMap.put(event.getSession(),event.getVenue);
}否则{
//如果地图上有这对
//那么它就不是唯一的了
返回false;
}
venueSessionMap.put(.getVincement();event.getSession();
}
返回true;
虽然代码没有经过测试,但您已经了解了总体思路,尽管它看起来相当复杂。如果您只需要检查是否有重复的代码(考虑场馆会话对),可能有更好的解决方案,您可以创建一个helper
Pair
类,该类仅包含在此特定情况下重要的属性。然后map
将事件映射到Pair
对象,删除重复项并检查大小是否相同
例如,您可以在列表中创建一个嵌套类:
class LineUp {
private List<Event> events = new ArrayList<>();
private static final class Pair<U, V> {
final U first;
final V second;
Pair(U first, V second) {
this.first = first;
this.second = second;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Pair)) {
return false;
}
Pair<U, V> that = (Pair<U, V>) o;
return Objects.equals(this.first, that.first)
&& Objects.equals(this.second, that.second);
}
@Override
public int hashCode() {
return Objects.hash(this.first, this.second);
}
}
// rest of the LineUp class
}
重写事件的hashcode(和equals)方法,根据其内容生成一个unquie值(我喜欢使用Apaches Commons API来实现这一点,但大多数IDE应该能够为您实现),并使用某种集合(例如HashSet),它将使项的非唯一性超越简单的“==”比较您必须使用ArrayList吗?设置似乎更合适,它不允许您插入相同的事件,您可以通过覆盖equals()
和hashcode()
methods来定义“相同性”。这是一个让人恼火和奇怪的地方。规范(我无法编辑,但必须遵守)“in Event”要求“Session Venture/and/Act”必须相等,才能使某个事件相等。但“Lineup”中有一个规范规定,如果“Lineup arraylist”中的某个事件的“地点”和“Session”相同,则这是不允许的。因此,我无法修改“Event equals”方法,其规范也不同。因此,我认为我不能使用该规范检查方法,你有其他选择吗?另外,我必须使用arraylist,因为顺序在不同的时间很重要,所以只要澄清一下,如果会话、地点和动作相等,事件是相等的。在队列中,你需要删除只有唯一的场所会话对的事件,对吗?不要删除它们,如果有相同的时间,只需在不变量上返回false重新复制场馆会话对。换句话说,阵容内的场馆会话对应该是唯一的。我已经为场馆实现了equals和hashcode。对不起,只是需要一些澄清。我可以使用此HashMap,就像我在类似MadProgrammer注释的实现中使用HashSet一样?---我刚刚发现“映射”类型。我该如何将列表arraylist的元素放入列表hashmap?
public boolean duplicateVenueSessions() {
// Map each Event to a Pair<Venue, Integer> and remove the duplicates
long numDistinct = this.events.stream()
.map(e -> new Pair<>(e.venue, e.session))
.distinct()
.count();
// return false if the original number of events is different from the
// number of distinct events considering only venue and session values
return this.events.size() != numDistinct;
}
public boolean duplicateVenueSessions() {
Set<Pair<String, Integer>> distinct = new HashSet<>();
for (Event e : this.events) {
Pair<String, Integer> venueSession = new Pair<>(e.venue, e.session);
if (distinct.contains(venueSession)) {
return true;
}
distinct.add(venueSession);
}
return false;
}