将自定义ArrayList转换为LinkedHashSet

时间:2013-02-03 15:48:54

标签: java android arraylist linkedhashset

我有一个自定义ArrayAdapter<Summary>,其中包含一系列事件。 List<Summary>中有重复的值,因此我尝试将List<Summary>的值设置为LinkedHashSet<Summary>,但这会显示一个空白页。

如何将自定义ArrayList转换为LinkedHashSet以获取唯一数据?

Main.java:

LinkedHashSet<Summary> listToSet = new LinkedHashSet<Summary>();
final List<Summary> summaries = new ArrayList<Summary>();

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v =  inflater.inflate(R.layout.events_summary, container, false);

    .......

    setListView(month, year, date_value);
    summaryAdapter = new SummaryAdapter(this.getActivity().getApplicationContext(), R.layout.listview_item_row, listToSet);

    calendarSummary = (ListView) v.findViewById(R.id.calendarSummary);
    calendarSummary.setAdapter(summaryAdapter);

    return v;
}

public void setListView(int month, int year, int dv) {

        events = new HolidayEvents();
        _calendar = Calendar.getInstance(Locale.getDefault());
        int totalDays = _calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

        for(int i = 1; i <= totalDays; i++){
            if(isHoliday(i, month, year, dv))
            {
                date = i + " " + getMonthForInt(month-1) + " " + year;

                for (Event event : events.eventDetails(this, month, i)) 
                {
                       summaries.add(new Summary(date, event.eventdetails));
                       listToSet.addAll(summaries);

                } 
            }
        }
}

ArrayAdapter.java:

public class SummaryAdapter extends ArrayAdapter<Summary>{

    Context context; 
    int layoutResourceId;
    LayoutInflater mInflater;
    LinkedHashSet<Summary> list = null;
    List<Summary> data = null;


    public SummaryAdapter(Context context, int layoutResourceId, LinkedHashSet<Summary> summaries) {
        super(context, layoutResourceId);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.list = summaries;
        data = new ArrayList<Summary>(list); //converting LinkedHashSet to List
        mInflater = LayoutInflater.from(context);
    }

 ....rest of the code retrieving data by using data.get(position) ...

1 个答案:

答案 0 :(得分:0)

您需要确保正确放入Set的类会覆盖Equals和hashCode函数。

让我们看看hashCode没有被覆盖的情况:

import java.util.*;

public class Example {

    public static class Abc {
        protected String s;
        public Abc(String s) {
            this.s = s;
        }

        @Override
        public boolean equals(Object other) {
            if (other instanceof Abc) {
                return ((Abc) other).s.equals(this.s);
            }
            return false;
        }

        @Override
        public int hashCode() {
            return (int) (Math.random() * Integer.MAX_VALUE);
        }

        public String toString() {
            return "Abc: " + this.s; 
        }
    }

    public static void main(String[] args) {

        ArrayList<Abc> ar = new ArrayList<>();

        ar.add(new Abc("a"));
        ar.add(new Abc("a"));
        ar.add(new Abc("a"));

        LinkedHashSet<Abc> lhs = new LinkedHashSet<>(ar);

        System.out.println("ar: " + ar);
        System.out.println("LinkedHashSet: " + lhs);

    }
}

这将产生:

  

ar:[Abc:a,Abc:a,Abc:a]   LinkedHashSet:[Abc:a,Abc:a,Abc:a]

即使equals正确实施。 我相信您可能需要仔细检查HashCodes和Equals的正确实现。