在我的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;进行排序?一旦它被填充?
答案 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
之前,让我们看看Docs对Comparator
的看法。
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的建议就此而言,本文做了很好的解释:
答案 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);