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

时间:2015-04-15 22:11:06

标签: java arraylist duplicates

我有一个名为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中的特定值?

感谢-你。

2 个答案:

答案 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;

代码虽然没有经过测试,但你会得到一般的想法,虽然看起来很复杂。可能有一个更好的解决方案