2011-03-01 82 views
20

的名单我有这样创建的列表变量:分拣地图<String,字符串>

List<Map<String, String>> list = new ArrayList<Map<String, String>>();

在我的Android应用程序,这个名单被填充。

只是一个例子:

Map<String, String> map1 = new HashMap<String, String>(); 
map.put("name", "Josh"); 
... 

Map<String, String> map2 = new HashMap<String, String>(); 
map.put("name", "Anna"); 
... 

Map<String, String> map3 = new HashMap<String, String>(); 
map.put("name", "Bernie"); 
... 

list.add(map1); 
list.add(map2); 
list.add(map3); 

我使用list通过扩展BaseAdapter并实现各种方法来显示一个ListView结果。

我的问题:我需要基于地图的关键

问题以字母顺序排序list:什么是一个简单的方法来排序的字母顺序list基于地图的关键

我似乎无法绕过我的头。我已将每个Map名称提取到String阵列中,并对其进行分类(Arrays.sort(strArray);)。但是,这并不保留在每个Map其他数据,所以我也不太清楚,我怎么可以保留其他映射值

+4

@DLK,知道如何编写自定义比较器正是binnyb发现的。 – 2011-03-01 15:04:12

+1

@Jon Skeet和@JB Nizet的答案都正确地指出'Map'可能是您的记录不好的选择。具有属性/ getters/setter的自定义类会更好。为什么? 1)鲁棒性/类型安全性,2)存储器使用,3)性能,4)更简单的代码。 – 2011-03-01 15:09:41

+0

感谢您的提示,我会研究如何改变设置。 – binnyb 2011-03-01 15:12:31

回答

29

下面的代码工作完全

public Comparator<Map<String, String>> mapComparator = new Comparator<Map<String, String>>() { 
    public int compare(Map<String, String> m1, Map<String, String> m2) { 
     return m1.get("name").compareTo(m2.get("name")); 
    } 
} 

Collections.sort(list, mapComparator); 

但您的地图可能应该是一个特定的类的实例。

+0

谢谢,这样做(用小的语法修复)。我将考虑为列表创建一个特定的类,我从来没有想过这样做。 – binnyb 2011-03-01 15:10:07

+2

我不知道你在地图中存储了什么,但如果它只是静态属性(名称,名字,年龄等),那么你甚至应该用一个类替换地图(例如:class Person {private String name ;私人字符串名字等) – 2011-03-01 15:13:50

5

你应该实现一个Comparator<Map<String, String>>基本上来自两个地图是提取“名称”值通过并比较它们。

然后使用Collections.sort(list, comparator)

您确定Map<String, String>确实是您列表中的最佳元素类型吗?也许你应该有另一类包含 a Map<String, String>,但也有一个getName()方法?

6
@Test 
public void testSortedMaps() { 
    Map<String, String> map1 = new HashMap<String, String>(); 
    map1.put("name", "Josh"); 

    Map<String, String> map2 = new HashMap<String, String>(); 
    map2.put("name", "Anna"); 

    Map<String, String> map3 = new HashMap<String, String>(); 
    map3.put("name", "Bernie"); 

    List<Map<String, String>> mapList = new ArrayList<Map<String, String>>(); 
    mapList.add(map1); 
    mapList.add(map2); 
    mapList.add(map3); 

    Collections.sort(mapList, new Comparator<Map<String, String>>() { 
     public int compare(final Map<String, String> o1, final Map<String, String> o2) { 
      return o1.get("name").compareTo(o2.get("name")); 
     } 
    }); 

    Assert.assertEquals("Anna", mapList.get(0).get("name")); 
    Assert.assertEquals("Bernie", mapList.get(1).get("name")); 
    Assert.assertEquals("Josh", mapList.get(2).get("name")); 

} 
+1

已发布20分钟前... – 2011-03-01 15:20:21

4

您需要创建一个比较器。我不知道为什么每个值都需要自己的地图,这里是比较会是什么样子:

class ListMapComparator implements Comparator { 
    public int compare(Object obj1, Object obj2) { 
     Map<String, String> test1 = (Map<String, String>) obj1; 
     Map<String, String> test2 = (Map<String, String>) obj2; 
     return test1.get("name").compareTo(test2.get("name")); 
    } 
} 

你可以看到它与上面的例子正与此:

public class MapSort { 
    public List<Map<String, String>> testMap() { 
     List<Map<String, String>> list = new ArrayList<Map<String, String>>(); 
     Map<String, String> myMap1 = new HashMap<String, String>(); 
     myMap1.put("name", "Josh"); 
     Map<String, String> myMap2 = new HashMap<String, String>(); 
     myMap2.put("name", "Anna"); 

     Map<String, String> myMap3 = new HashMap<String, String>(); 
     myMap3.put("name", "Bernie"); 


     list.add(myMap1); 
     list.add(myMap2); 
     list.add(myMap3); 

     return list; 
    } 

    public static void main(String[] args) { 
     MapSort ms = new MapSort(); 
     List<Map<String, String>> testMap = ms.testMap(); 
     System.out.println("Before Sort: " + testMap); 
     Collections.sort(testMap, new ListMapComparator()); 
     System.out.println("After Sort: " + testMap); 
    } 
} 

您将有一些类型的安全警告,因为我不担心这些。希望有所帮助。

0
try { 
     java.util.Collections.sort(data, 
       new Comparator<Map<String, String>>() { 
        SimpleDateFormat sdf = new SimpleDateFormat(
          "MM/dd/yyyy"); 

        public int compare(final Map<String, String> map1, 
          final Map<String, String> map2) { 
         Date date1 = null, date2 = null; 
         try { 
          date1 = sdf.parse(map1.get("Date")); 
          date2 = sdf.parse(map2.get("Date")); 
         } catch (ParseException e) { 
          e.printStackTrace(); 
         } 
         if (date1.compareTo(date2) > 0) { 
          return +1; 
         } else if (date1.compareTo(date2) == 0) { 
          return 0; 
         } else { 
          return -1; 
         } 
        } 
       }); 

    } catch (Exception e) { 

    } 

0

位出话题
这是UTIL基于上面的答案
可能是有人在注视着sharedpreferences
一点这将有利于

@SuppressWarnings("unused") 
public void printAll() { 
    Map<String, ?> prefAll = PreferenceManager 
     .getDefaultSharedPreferences(context).getAll(); 
    if (prefAll == null) { 
     return; 
    } 
    List<Map.Entry<String, ?>> list = new ArrayList<>(); 
    list.addAll(prefAll.entrySet()); 
    Collections.sort(list, new Comparator<Map.Entry<String, ?>>() { 
     public int compare(final Map.Entry<String, ?> entry1, final Map.Entry<String, ?> entry2) { 
      return entry1.getKey().compareTo(entry2.getKey()); 
     } 
    }); 
    Timber.i("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); 
    Timber.i("Printing all sharedPreferences"); 
    for(Map.Entry<String, ?> entry : list) { 
     Timber.i("%s: %s", entry.getKey(), entry.getValue()); 
    } 
    Timber.i("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); 
} 
1

,如果你想要使用拉姆达,并使其更容易阅读

List<Map<String,String>> results; 

    Comparator<Map<String,String>> sortByName = Comparator.comparing(x -> x.get("Name")); 

    public void doSomething(){ 
    results.sort(sortByName) 
    } 
相关问题