如何对ArrayList <hashmap <integer,boolean =“”>&gt;?进行排序?

时间:2017-05-12 03:31:09

标签: android sorting arraylist

在我的MainActivity.java中,我有:

public static ArrayList<HashMap<Integer,Boolean>> booleanArrayList = new ArrayList<>();

public static void setBooleanArrayList(int p, Boolean b){
    HashMap<Integer,Boolean> map = new HashMap<>();
    map.put(p, b);
    booleanArrayList.add(map);
}
public static HashMap<Integer, Boolean> getBooleanArrayList(int position){
    return booleanArrayList.get(position);
}

我有一个有按钮的片段。单击该按钮时,我希望它按升序对MainActivity.booleanArrayList进行排序。

例如:

{1,true}
{4,true}
{2,false}
{3,true}

排序方法:

{1=true}
{2=false}
{3=true}
{4=true}

我如何对ArrayList&gt;进行排序?一旦它被填充?

2 个答案:

答案 0 :(得分:0)

这样做有两个步骤。首先,编写一个比较2个地图的比较器:

public class MapKeyComparator implements Comparator<Map<Integer, Boolean>> {

        @Override
        public int compare(Map<Integer, Boolean> me, Map<Integer, Boolean> him) {
            Set<Integer> meSet = me.keySet();
            Set<Integer> himSet = him.keySet();
            // Sanity check
            if(me.size() != 1 || himSet.size() != 1){
                throw new RuntimeException("Comparison can only be done between 2 valid integers.");
            }
            // Values
            int meI = 0, himI = 0;
            for(Integer i : meSet){
                meI = i;
            }
            for(Integer i : himSet){
                himI = i;
            }
            // Compare
            if(meI > himI){
                return -1;
            }
            else if(meI < himI){
                return 1;
            }
            else{
                return 0;
            }
        }
    }

然后,按如下方式对列表进行排序:

Collections.sort(booleanArrayList, new MapKeyComparator());

说明:

嗯,Comparator是一个可以实现比较2个对象的接口,比如Integers。它可以是任何一般的对象,但考虑一下,因为它是比较,它也应该有意义比较它们。例如,您不会将Bird对象与Tree进行比较。您可以将一个Bird类型与另一个类型进行比较,因为它们具有您可以比较的属性。

现在,在您的情况下,我们必须比较ArrayList中存在的地图的键。这意味着,要比较的对象是Map,但是基于什么?

嗯,你已经知道了 - 地图的关键。并且,Comparator是一个促进这一点的接口。

因此,我们将构建一个Comparator,用于根据每个Map的键来比较2个地图。反过来,Comparator方法应使用Collections.sort()来获取要比较的对象列表,并使用Comparator来比较它们。

在我们构建Comparator之前,让我们看看DocsComparator的看法。

public interface Comparator<T>
     

比较函数,对某些函数施加总排序   对象的集合。可以将比较器传递给排序方法   (例如Collections.sort或Arrays.sort)允许精确控制   超过排序顺序。比较器也可用于控制订单   某些数据结构(如排序集或排序映射)或   为没有对象的对象集合提供排序   自然排序。

关于你必须实施的方法,

int compare(T o1, T o2)
  

<强>参数

     

o1 - 要比较的第一个对象。    o2 - 要比较的第二个对象。

     

<强>返回:       第一个参数的负整数,零或正整数小于,等于或大于第二个参数。

请注意,如果第一个对象大于秒,则返回1。但是我在实现中做了相反的操作,以便您可以在Collections.sort()中获得升序排列而不是降序排列。

实施:

实现本身非常简单。由于我必须比较地图中的键,因此我在Set中检索键:

Set<Integer> meSet = me.keySet();
Set<Integer> himSet = him.keySet();

接下来,我检查它们是否只有一个元素,以便比较实际上有意义:

// Sanity check
if (me.size() != 1 && himSet.size() != 1) {
    throw new RuntimeException("Comparison can only be done between 2 valid integers.");
}

接下来,我迭代这些集合以获得它们中的一个元素:

// Values
int meI = 0, himI = 0;
for (Integer i: meSet) {
    meI = i;
}
for (Integer i: himSet) {
    himI = i;
}

接下来,我们实际比较它们,

// Compare
if (meI > himI) {
    return -1;
} else if (meI < himI) {
    return 1;
} else {
    return 0;
}

另请参阅Collections.sort() TreeMap方法。

说了这么多,还有其他(更好的)你可以为你的基本问题做的事情,例如使用-Q在你使用自然排序插入时排列元素。所以当你检索它们时,你会按照你一直想要的顺序得到它们。 @ ravi-koradia的建议就此而言,本文做了很好的解释:

docs

答案 1 :(得分:0)

您可以使用自己的自定义类与位置和选定值字段代替Map,因为我可以看到您只需要保留这两个值,并且列表中的每个地图都只有单个值。

public static ArrayList<Values> booleanArrayList = new ArrayList<>();

public class Values implements Comparable<Values>{
    int position;
    boolean isSelected;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Values values = (Values) o;

        return position == values.position;

    }

    @Override
    public int hashCode() {
        return position;
    }


    @Override
    public int compareTo(@NonNull Values o) {
        return (position < o.position) ? -1 : ((position == o.position) ? 0 : 1);
    }
}

之后,你可以从任何地方打电话给arraylist排序: -

Collections.sort(booleanArrayList);