我有一个名为LineUp的类,它是一个名为Event的类的ArrayList。 Event有三个值:String Act,Venue(它自己的类)和一个int Session。
可能会像这样声明一个事件。 事件e1 =新事件(“Foo Fighters”,北部,“1”) LineUp是一个ArrayList,Event是e1之类的元素。
在我的LineUp类中,我必须创建一个不变量来检查ArrayList阵容中包含的每个Event都有一个唯一的Venue和Session。因为这项任务要求我完全遵循规范,所以Act,Venue和Session的组合是否唯一是无关紧要的,遵循规范我必须/仅/确保Venue和Session是唯一的。
如何检查重复项,但仅检查ArrayList中的特定值?
感谢-你。
答案 0 :(得分:1)
如果您只需要检查是否存在重复项(考虑场地会话对),您可以创建一个帮助器Pair
类,其中只包含在此特定情况下重要的属性。然后map
将事件发送到Pair
个对象,删除重复项并检查大小是否相同。
例如,您可以在LineUp
:
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
}
然后创建一个方法,如果有任何重复项,则返回false:
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;
}
如果无法使用Java 8,则可以改为使用Set
:
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;
}
答案 1 :(得分:0)
如果我理解了所有内容,您可以在方法中使用Map来存储值
Map<Map<Venue, Integer>, Act> lineup = new HashMap<>();
它结合了Venue-Session对的唯一性。
然而,由于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;
代码虽然没有经过测试,但你会得到一般的想法,虽然看起来很复杂。可能有一个更好的解决方案