每次扫描pctCode时,我都会将项目添加到ArrayList
。不幸的是,当用户扫描两次时,我可以获得双重物品。
通过Google我发现:
解决方案A(在添加之前,查看列表是否已存在):
if (ListOrdres.contains(OrdreItem))
ListOrdres.add(OrdreItem);
解决方案B(使用HashSet):
ListOrdres.add(OrdreItem);
HashSet<Pers_Ordre> hs = new HashSet();
hs.addAll(ListOrdres);
ListOrdres.clear();
ListOrdres.addAll(hs);
既不是解决方案A也不是B工作,我仍然会得到双重项目。
这是我的代码:
public class MainActivity extends Activity implements OnClickListener
{
...
ArrayList<Pers_Ordre> ListOrdres = new ArrayList<Pers_Ordre>();
....
@Override
public void onClick(View v)
{
switch(v.getId())
{
case R.id.btn_Scan:
{
IntentIntegrator scanIntegrator = new IntentIntegrator(this);
scanIntegrator.initiateScan();
........
public void onActivityResult ( int requestCode, int resultCode, Intent intent)
{
.......
//retrieve scan result
IntentResult scanningResult =
IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
if(scanningResult != null)
{
//we have a result
String scanContent = scanningResult.getContents();
if(scanContent != null)
{
Pers_Ordre OrdreItem = new Pers_Ordre();
String[] TempOrdre = scanContent.split("_");
OrdreItem.setLe_CodeClient(TempOrdre[0]);
OrdreItem.setLe_CodeDest(TempOrdre[1]);
OrdreItem.setLe_NoOrdre(TempOrdre[2]);
OrdreItem.setLe_Ordre_1(TempOrdre[3]);
OrdreItem.setLe_Ordre_2(TempOrdre[4]);
OrdreItem.setLe_Date(LedateFormat.format(Ledate));
OrdreItem.setLe_GPS(TempAddr);
ListOrdres.add(OrdreItem);
HashSet<Pers_Ordre> hs = new HashSet();
hs.addAll(ListOrdres);
ListOrdres.clear();
ListOrdres.addAll(hs);
m_adapter = new CustomListAdapter(this, ListOrdres);
m_adapter.notifyDataSetChanged();
lv_Ordre.setAdapter(m_adapter);
}
}
}
}
}
}
}
这是我的Persistence Ordre Code:
public class Pers_Ordre {
private String Le_CodeClient;
private String Le_CodeDest;
private String Le_NoOrdre;
private String Le_Ordre_1;
private String Le_Ordre_2;
private String Le_Date;
private String Le_GPS;
public String getLe_Date() {
return Le_Date;
}
public void setLe_Date(String le_Date) {
Le_Date = le_Date;
}
public String getLe_GPS() {
return Le_GPS;
}
public void setLe_GPS(String le_GPS) {
Le_GPS = le_GPS;
}
public String getLe_CodeClient() {
return Le_CodeClient;
}
public void setLe_CodeClient(String le_CodeClient) {
Le_CodeClient = le_CodeClient;
}
public String getLe_CodeDest() {
return Le_CodeDest;
}
public void setLe_CodeDest(String le_CodeDest) {
Le_CodeDest = le_CodeDest;
}
public String getLe_NoOrdre() {
return Le_NoOrdre;
}
public void setLe_NoOrdre(String le_NoOrdre) {
Le_NoOrdre = le_NoOrdre;
}
public String getLe_Ordre_1() {
return Le_Ordre_1;
}
public void setLe_Ordre_1(String le_Ordre_1) {
Le_Ordre_1 = le_Ordre_1;
}
public String getLe_Ordre_2() {
return Le_Ordre_2;
}
public void setLe_Ordre_2(String le_Ordre_2) {
Le_Ordre_2 = le_Ordre_2;
}
答案 0 :(得分:3)
此案例的首选集合类型为HashSet
,但您需要覆盖Pers_Ordre
类中的equals
和hashCode
方法。就像现在一样,每当你检查一个项目是否已经存在时,就会根据对象标识执行检查,并且只有当这些对象实际上是同一个对象时才会返回true。
如果您不想自己实施equals
和hashCode
方法,可以让IDE自动为您生成它们。默认情况下,大多数IDE将生成一个实现,通过比较所有对象的字段进行equals
比较,并根据所有对象的字段生成hashCode
值。然后,您可以在必要时进行调整。
此SO问题为equals
和hashCode
实施提供了一些很好的指示:What issues should be considered when overriding equals and hashCode in Java?
本教程提供了基本的介绍:http://tutorials.jenkov.com/java-collections/hashcode-equals.html
答案 1 :(得分:2)
以下是样本......
如果您的List包含重复项,则可以获取如下唯一条目:
List<String> gasList = // create list with duplicates...
Set<String> uniqueGas = new HashSet<String>(gasList);
System.out.println("Unique gas count: " + uniqueGas.size());
注意:此HashSet构造函数通过调用元素来识别重复项。 equals()方法。