【问题标题】:Android: Sort data retrieved from SharedPreferencesAndroid:对从 SharedPreferences 检索到的数据进行排序
【发布时间】:2012-06-26 12:45:52
【问题描述】:

我正在尝试在 Android 中存储数据。我正在使用SharedPreferences。我正在使用以下方法检索这些数据:

 SharedPreferences myPrefs = this.getSharedPreferences("myPrefs", MODE_WORLD_READABLE);
            Map<String, ?> keys = myPrefs.getAll();
            for (Map.Entry<String, ?> entry : keys.entrySet()) {
                Log.i("map values", entry.getKey());
                            //some code
 }

编辑:

但检索到的数据与插入时的顺序不同。如何获得相同的订单?

【问题讨论】:

  • 您可以通过创建自己的比较器对地图进行排序。检查here
  • 啊。您想要与它们插入时相同的顺序吗?以这样的简单方式无法做到这一点 - 当从文件中加载键和值时,信息会丢失。
  • 谢谢。这意味着我应该找到自己的方法来做到这一点......

标签: android sorting sharedpreferences


【解决方案1】:

将生成的Map 复制到SortedMap 的实现中,例如TreeMap.

像这样(按key排序):

SharedPreferences myPrefs = this.getSharedPreferences("myPrefs", MODE_WORLD_READABLE);
TreeMap<String, ?> keys = new TreeMap<String, Object>(myPrefs.getAll());
for (Map.Entry<String, ?> entry : keys.entrySet()) {
    Log.i("map values", entry.getKey());
    //some code
}

要按 value & 不丢失任何键值对(因为 Map 很容易允许重复值映射到不同的键),您需要先转换它进入 List 并对其进行排序。

    List<Pair<Object, String>> sortedByValue = new LinkedList<Pair<Object,String>>();
    for (Map.Entry<String, ?> entry : keys.entrySet()) {
        Pair<Object, String> e = new Pair<Object, String>(entry.getValue(), entry.getKey());
        sortedByValue.add(e);
    }

    // Pair doesn't have a comparator, so you're going to need to write one.
    Collections.sort(sortedByValue, new Comparator<Pair<Object, String>>() {
        public int compare(Pair<Object, String> lhs, Pair<Object, String> rhs) {
            // This is a naive and shitty comparator, but it works for
            // arbitrary objects. Sort of. Tweak depending on the order you need.
            String sls = String.valueOf(lhs.first);
            String srs = String.valueOf(rhs.first);
            int res = sls.compareTo(srs);
            // Sort on value first, key second
            return res == 0 ? lhs.second.compareTo(rhs.second) : res;
        }
    });

    for (Pair<Object, String> pair : sortedByValue) {
        Log.i("map values", pair.first + "/" + pair.second);
    }

【讨论】:

  • 如何按值对数据进行排序?
【解决方案2】:

按顺序添加属性,就像这样... 先保存设置...

public static void saveSettings(final Editor editor, final String [] order) {
    final String csl = toString(order);//comma separated
    editor.putString("insert_order", csl);
    for (int i = 0; i < values.length; i++) {
        editor.putString(values[i], your_value[i]);
    }
}

现在加载它们:

public static List<String> loadSetting(final SharedPreferences preferences) {
    final List<String> inOrder = new ArrayList<>(); 
    final String[] ordering = preferences.getString("insert_order", "").split(",");
    for (final String item : ordering) {
        final String value = (String) preferences.getString(item, "");
        inOrder.add(value);
    }
    return inOrder;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多