带有自定义AddAll方法的Java ArrayList

带有自定义AddAll方法的Java ArrayList,java,android,arraylist,Java,Android,Arraylist,我有一个名为News的自定义类,每个新闻本身都有一个唯一的id: public class News{ public long id; public String title; //... } 现在我想为我的数据集使用定制的ArrayList 这是我的自定义ArrayList: public class NewsArrayList<E> extends ArrayList<News> { @Override public boo

我有一个名为
News
的自定义类,每个新闻本身都有一个唯一的
id

public class News{ 
    public long id;
    public String title;
    //...
}
现在我想为我的
数据集使用定制的
ArrayList

这是我的自定义
ArrayList

public class NewsArrayList<E> extends ArrayList<News> {
    @Override
    public boolean addAll(Collection<? extends News> c) {
        ArrayList<News> b = new ArrayList<>();
        boolean notExists;
        for (News n : c) {
            notExists = true;
            for (News ex : this) {
                if (n.id == ex.id) {
                    notExists = false;
                    break;
                }
            }
            if (notExists)
                b.add(n);
        }
        return super.addAll(b);
    }
}

如果您想要一个没有重复的集合,请考虑使用<代码> SET>代码>,如果您想保持订单使用A,则只需重写方法>代码>等于<代码>代码> <代码> HASCOD> <代码> >您的类<代码>新闻< /代码> .< 例如:

ArrayList<News> myNews = mDatabase.getNewsByOffset(5,10); // will return first 5 News from database
NewsArrayList<News> mDataset = new NewsArrayList<>();
mDataset.addAll(myNews);
myNews = mDatabase.getNewsByOffset(4,10); // will return first 4 News from database
mDataset.addAll(myNews);
@Override
public boolean equals(final Object o) {
    if (this == o) return true;
    if (o == null || this.getClass() != o.getClass()) return false;

    final News news = (News) o;

    return this.id == news.id;

}

@Override
public int hashCode() {
    return (int) (this.id ^ this.id >>> 32);
}
您的代码将是:

ArrayList<News> myNews = mDatabase.getNewsByOffset(5,10); // will return first 5 News from database
Set<News> mDataset = new LinkedHashSet<>(myNews);
myNews = mDatabase.getNewsByOffset(4,10); // will return first 4 News from database
mDataset.addAll(myNews);
还有一个简单的问题,这次休息;,打破所有的循环 还是只有内在的

....
for (News n : c) {
    notExists = true;
    for (News ex : this) {
        if (n.id == ex.id) {
            notExists = false;
            break;
        }
    }
    if (notExists)
        b.add(n);
}
....
它仅打断内部循环以打断所有循环使用标签作为下一步:

main: for (News n : c) {
    ...
    for (News ex : this) {
        if (n.id == ex.id) {
            ...
            // Break the loop with the label main
            break main;
        }
    }
    ...
}

这种方法可以奏效,但不是实现这一点的最直接或最有效的方法

通常,如果您希望确保在一个集合中只有一个特定项的副本,则可以使用集而不是列表。集合将自动确保您没有任何重复项

<>为了使SET正确地检测和避免重复存储,你需要在你的新闻类中实现<强> >()/<强>和<强> HASCODE()/St>>方法,这样它就知道何时考虑两个新闻实例是“相同的”。在您的情况下,看起来您只需引用“id”就可以唯一地标识每个新闻条目。IDE可能会自动生成equals()/hashCode()方法,这是一个常见的特性


最常用的集合实现是HashSet。使用HashSet和您的方法之间的主要区别在于,HashSet不会按照您添加项目时的顺序为您提供项目。这可能不是问题。如果是,您可以使用LinkedHashSet来代替A
List
是错误的集合类型,您需要避免重复。改为使用
Set
的实现,例如
TreeSet
,它保留元素的顺序,可以是元素的自然顺序,也可以是由插入实例化的
比较器确定的顺序。我的例子有吗@TimothyTruckle关于你的最后一个问题,你为什么不直接输入sysout语句来检查如果达到break会发生什么?没有例子,只是Java API和TreeSet上的Set接口的契约,你也应该阅读教程:但是,
TreeSet
不能在Adapters@TimothyTruckle中使用数据集,或者我的项目结构不允许这样做。对不起,这是怎么回事
this.id^this.id>>32
A
Set
不能是我项目中适配器的编写器intellij生成的是什么,如果你想知道它是什么,请检查位运算符你所说的“Set不能是我项目中适配器的编写器”是什么意思,如果您想保留
列表
,请检查
main: for (News n : c) {
    ...
    for (News ex : this) {
        if (n.id == ex.id) {
            ...
            // Break the loop with the label main
            break main;
        }
    }
    ...
}