带有自定义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来代替AList
是错误的集合类型,您需要避免重复。改为使用Set
的实现,例如TreeSet
,它保留元素的顺序,可以是元素的自然顺序,也可以是由插入实例化的比较器确定的顺序。我的例子有吗@TimothyTruckle关于你的最后一个问题,你为什么不直接输入sysout语句来检查如果达到break会发生什么?没有例子,只是Java API和TreeSet上的Set接口的契约,你也应该阅读教程:但是,TreeSet
不能在Adapters@TimothyTruckle中使用数据集,或者我的项目结构不允许这样做。对不起,这是怎么回事this.id^this.id>>32
ASet
不能是我项目中适配器的编写器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;
}
}
...
}