在字符串数组android中搜索key的值

时间:2011-08-31 11:50:19

标签: android

我的res / values / strings.xml

中有一个字符串数组
 <string-array name="my_list">  
    <item>Item1</item>
    <item>Item2</item>
</string-array>

我在我的应用程序中访问它并将其与循环中的值进行比较。

String[] myStrings = getResources().getStringArray(R.array.my_list);
for(int i=0;i<myStrings.length;i++)
{
    System.out.println(myStrings[i]);
}

现在我需要根据键搜索项目以获取相应的项目。例如

<string-array name="my_list">  
    <item name="one">Item1</item>
    <item name="two">Item2</item>
</string-array>

如果我的搜索干草键“一”,则获得其对应的值(Item1)。

如何完成此任务。

由于

8 个答案:

答案 0 :(得分:17)

好吧,我已经使用两个数组完成了它。易于管理。

一把钥匙:

<string-array name="codes">
        <item>AC</item>
        <item>AD</item>
        <item>AE</item>
</string-array>

一个值:

<string-array name="names">
        <item>Ascension</item>
        <item>Andorra</item>
        <item>United Arab Emirates</item>
</string-array>

和搜索方法。

private String getCountryByCode(String code) {
        int i = -1;
        for (String cc: getResources().getStringArray(R.array.codes)) {
            i++;
            if (cc.equals(code))
                break;
        }
        return getResources().getStringArray(R.array.names)[i];
    }

答案 1 :(得分:9)

你有一个像数据结构的地图。遗憾的是,目前无法通过XML创建字符串映射。

您可以使用Java完成所有操作,也可以在Raw XML文件中编写地图,并在运行时将其读取/解析到地图中。

答案 2 :(得分:8)

不幸的是,没有内置的方法可以实现,但你可以这样做:

   <string-array name="my_array">
        <item>key1|value1</item>
        <item>key2|value2</item>
   </string-array>

并且有一个类似的函数:

Map<String, String> getKeyValueFromStringArray(Context ctx) {
    String[] array = ctx.getResources().getStringArray(R.array.my_array);
    Map<String, String> result = new HashMap<>();
    for (String str : array) {
        String[] splittedItem = str.split("|");
        result.put(splittedItem[0], splittedItem[1])
    }
    return result
}

它看起来有点黑客,但总的来说,因为你可以控制你的字典 - 可能它不是那么糟糕。

答案 3 :(得分:2)

我遇到了同样的问题。 我的决定是在xml文件中创建许多字符串(不是字符串数组)并在代码中创建String []数组。它看起来像这样:

    Builder builder = new AlertDialog.Builder(DMCBrowser.this);
    builder.setTitle(R.string.title_playlist);
    final CharSequence[] items = new CharSequence[] { getResources().getString(R.string.watch_all),
                        getResources().getString(R.string.select_items) };
    builder.setItems(items, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if (items[which].equals(getResources().getString(R.string.watch_all))) {
                            Log.d(TAG, "Watch all");
                        } else if (items[which].equals(getResources().getString(R.string.select_items))) {
                            Log.d(TAG, "Select items");
                        }
                    }
                }).show();

虽然它看起来不那么紧凑,但我们不仅可以通过不可理解的标识符(如1或2),而且通过人类可读的android R-id将一个项目与另一个项目区分开来。如果我想更改项目顺序,那将非常容易。

答案 4 :(得分:2)

执行此操作的一个好方法是使用XML创建一个数组数组,如下所示。然后使用本机函数可以很容易地获得所需命名索引的数组,并在其中获取字符串。

<string-array name="one">
    <item>"Item 1"</item>
</string-array>

<string-array name="two">
    <item>"Item 2"</item>
</string-array>

<array name="my_list">
    <item>@array/one</item>
    <item>@array/two</item>
</array>

答案 5 :(得分:2)

XML:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string-array name="area_key">
    <item>北</item>
    <item>中</item>
    <item>南</item>
  </string-array>
  <integer-array name="area_value">
    <item>0</item>
    <item>1</item>
    <item>2</item>
  </integer-array>
</resources>

Java文件:

String[] areaKey = getResources().getStringArray(R.array.area_key);
int[] areaValue = getResources().getIntArray(R.array.area_value);
HashMap<String, Integer> areas = new HashMap<String, Integer>();
for (int i = 0; i < areaKey.length; i++) {
  areas.put(areaKey[i], areaValue[i]);
}

答案 6 :(得分:0)

你可以在java代码中使用:

 public static HashMap<Integer, String> getAll()
 {
            HashMap<Integer, String> items = new HashMap<Integer, String>();
            items.put(0, "item 1");
            items.put(1, "item 2");
            items.put(2, "item 3");
            return items;
 }

 public static Integer getKey(Map hm, String value) {
            for (Object o : hm.keySet()) {
                if (hm.get(o).equals(value)) {
                    return (Integer)o;
                }
            }
            return 0;
 }

并绑定到微调器:

Spinner spn_items = (Spinner) view.findViewById(R.id.spn_items);
ArrayAdapter<Object> adapter = new ArrayAdapter<Object>(getActivity(),android.R.layout.simple_spinner_dropdown_item, getAll().values().toArray());    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spn_items.setAdapter(adapter);

答案 7 :(得分:-1)

您可以使您的字符串数组的资源如下所示显示为hashmap类:

<string-array name="list_websites">
        <item>
            <string name="title">Amazon</string>
            <string name="isChecked">0</string>
        </item>
        <item>
            <string name="title">eBay</string>
            <string name="isChecked">0</string>
        </item>
        <item>
            <string name="title">Sam\'s Club</string>
            <string name="isChecked">0</string>
        </item>
        <item>
            <string name="title">Wallmart</string>
            <string name="isChecked">0</string>
        </item>
        <item>
            <string name="title">Best Buy</string>
            <string name="isChecked">0</string>
        </item>
        <item>
            <string name="title">Rekuten</string>
            <string name="isChecked">0</string>
        </item>
</string-array>

现在上面的代码可以解析为HashMap类型的ArrayList。