如何在String Array中查找ArrayList项的索引

时间:2015-10-06 12:12:57

标签: java arrays arraylist

我想在字符串数组中找到ArrayList<String>项的索引,但每次indexOf()都给-1索引。

我不明白哪里出错了?请检查我的代码并指导我。

public static void arrangeUiComponent() {

    ArrayList<String> packageName = new ArrayList<String>();
    packageName.add("com.example.dummy");
    packageName.add("edu.app.reading");
    ArrayList<Integer> index = getIndex(packageName);

}

//搜索方法

private static ArrayList<Integer> getIndex(ArrayList<String> searchName) {

    ArrayList<Integer> indexList = new ArrayList<Integer>();
    String[] collectionData = new String[] { "com.example.app",
            "com.example.appdemo", "com.example.dummy", "edu.app.reading",
            "edu.app.knowledge" };

    /*
     * for iterating each and every item of list
     */
    for (int i = 0; i < searchName.size(); i++) {
        Log.i("MISSION", "value will be: " + searchName.get(i).toString());
        /*
         * for searching listItem in package name array
         */
        for (int j = 0; j < collectionData.length; j++) {
            indexList.add(collectionData.toString().indexOf(searchName.get(i).toString()));
            break;
        }
    }
    return indexList;
}

5 个答案:

答案 0 :(得分:6)

替换

    for (int j = 0; j < collectionData.length; j++) {
        indexList.add(collectionData.toString().indexOf(searchName.get(i).toString()));
        break;
    }

      indexList.add(Arrays.asList(collectionData).indexOf(searchName.get(i)));

Here是您代码的工作演示。 Arrays.asList会将您的string array转换为list。为什么不使用list代替string collectionData array

答案 1 :(得分:1)

使用调试器并查看collectionData.toString()的值。 它返回的东西不是你的字符串列表。即对象表示。 引自javadoc

  

类Object的toString方法返回一个字符串,该字符串由对象为实例的类的名称,符号字符“@”和对象的哈希码的无符号十六进制表示组成。 / p>

修改 哎呀,collectionData是一个数组,而不是List,你应该使用

java.util.Arrays.asList(collectionData).indexOf(searchName.get(i))

它将搜索searchName.get(i)列表中的collectionData字符串,而不是collectionData表示形式的字符串(这就是indexOf有效的原因)。

由于searchName是字符串列表,因此您无需在toString()上添加searchName.get(i)

答案 2 :(得分:1)

我假设在indexLIst中你需要相应的packageName's索引值。

我不认为这会以你想要的方式运作。 indexListArraylist(数据未存储在输入顺序中)可能没有相应的索引值。
实施例
packageName列表:
“com.example.dummy”,“edu.app.reading”
所以indexList应该有值:
2,3,

但它可能包含:
3,也是因为数据没有按照输入的顺序存储。

如果您想保留订单,则应该使用linkedList。  使用Hashmap<String, integer>


你可以使用hashmap做这样的事情:

public static void arrangeUiComponent() {

        ArrayList<String> packageName = new ArrayList<String>();
        packageName.add("com.example.dummy");
        packageName.add("edu.app.reading");
        HashMap<String, Integer> indexMap = getIndex(packageName);
        for (String s : packageName) {
            int index = indexMap.get(s);
        }

    }

    private static HashMap<String, Integer> getIndex(ArrayList<String> searchName) {

        HashMap<String, Integer> indexMap = new HashMap<String, Integer>();
        String[] collectionData = new String[] { "com.example.app", "com.example.appdemo", "com.example.dummy",
                "edu.app.reading", "edu.app.knowledge" };

        for (String search : searchName) {
            for (int i = 0; i < collectionData.length; i++) {
                if (search.equals(collectionData[i])) {
                    indexMap.put(search, i);
                    break;
                }
            }
        }
        return indexMap;
    }

答案 3 :(得分:0)

您使用返回collectionData.toString()的{​​{1}}。因此[Ljava.lang.String;@15db9742始终找不到任何内容并返回collectionData.toString().indexof()

要解决此问题,您可以使用:

将arraylist声明为

-1
ArrayList<String>cd = new ArrayList<String>(Arrays.asList(collectionData)); 转换为String[]然后ArrayList

为我们提供了使用ArrayList查找元素的便利。

然后在你的内部循环

indexof()

答案 4 :(得分:0)

数组的

toString()方法返回类似[Ljava.lang.String;@2a139a55的内容。这就是您将索引值设为-1的原因。

除了提供的sam2090解决方案之外,您还可以尝试2个选项。

替换

indexList.add(collectionData.toString().indexOf(searchName.get(i).toString()))

indexList.add(java.util.Arrays.binarySearch(collectionData, searchName.get(i)))

collectionData.toString()替换为java.util.Arrays.toString(values)