如何在ArrayList中只获取唯一的项目

时间:2014-08-14 12:26:42

标签: android arraylist hashset

每次扫描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;
    }

2 个答案:

答案 0 :(得分:3)

此案例的首选集合类型为HashSet,但您需要覆盖Pers_Ordre类中的equalshashCode方法。就像现在一样,每当你检查一个项目是否已经存在时,就会根据对象标识执行检查,并且只有当这些对象实际上是同一个对象时才会返回true。

如果您不想自己实施equalshashCode方法,可以让IDE自动为您生成它们。默认情况下,大多数IDE将生成一个实现,通过比较所有对象的字段进行equals比较,并根据所有对象的字段生成hashCode值。然后,您可以在必要时进行调整。


此SO问题为equalshashCode实施提供了一些很好的指示: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()方法。