Java 如何检查ArrayList特定元素的唯一性

Java 如何检查ArrayList特定元素的唯一性,java,arraylist,duplicates,Java,Arraylist,Duplicates,我有一个叫做LineUp的类,它是一个叫做Event的类的ArrayList。一个事件有三个值:一个字符串Act、一个地点(它自己的类)和一个int会话 事件可以这样声明。 事件e1=新事件(“Foo战斗机”,北舞台,“1”) LineUp是一个ArrayList,事件是像e1这样的元素 在我的LineUp类中,我必须生成一个不变量来检查ArrayList列表中包含的每个事件是否具有唯一的地点和会话。由于本次任务要求我严格遵守规范,因此与Act、场馆和会议的组合是否唯一无关,为了遵守规范,我必须

我有一个叫做LineUp的类,它是一个叫做Event的类的ArrayList。一个事件有三个值:一个字符串Act、一个地点(它自己的类)和一个int会话

事件可以这样声明。 事件e1=新事件(“Foo战斗机”,北舞台,“1”) LineUp是一个ArrayList,事件是像e1这样的元素

在我的LineUp类中,我必须生成一个不变量来检查ArrayList列表中包含的每个事件是否具有唯一的地点和会话。由于本次任务要求我严格遵守规范,因此与Act、场馆和会议的组合是否唯一无关,为了遵守规范,我必须/仅/确保场馆和会议是唯一的

如何在ArrayList中检查重复项但仅检查特定值


谢谢。

如果我理解正确,您可以在方法中使用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;
}