【问题标题】:How can I get only unique items in my ArrayList如何在我的 ArrayList 中仅获取唯一项目
【发布时间】:2014-08-14 12:26:41
【问题描述】:

每次我扫描 pctCode 时,我都会将项目添加到我的 ArrayList。不幸的是,当用户扫描两次时,我可以得到双份。

通过谷歌我发现:

解决方案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);
                        }
                    }
                }
            }
        }
    }
}

这是我的持久性命令代码:

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;
    }

【问题讨论】:

  • 您在第一个if 语句中的条件是错误的。只有当它已经存在于数组中时它才会添加项目,这永远不会(如果没有在其他地方填充数组)。用 !. 否定条件

标签: android arraylist hashset


【解决方案1】:

这种情况下选择的集合类型是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

【讨论】:

  • 感谢您的回复,能否请您提供一个截断的代码?
  • 你真的不需要 sn-p 代码,如果你使用的是 Eclipse,那么只需转到源代码 -> 生成 hashcode() 和 equals()
【解决方案2】:

这里是示例...

如果您有一个包含重复项的列表,您可以获得这样的唯一条目:

List<String> gasList = // create list with duplicates...
Set<String> uniqueGas = new HashSet<String>(gasList);
System.out.println("Unique gas count: " + uniqueGas.size());

注意:此 HashSet 构造函数通过调用元素的 equals() 方法来识别重复项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 2012-11-05
    • 2012-07-24
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多