我想在字符串数组中找到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;
}
答案 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
索引值。
我不认为这会以你想要的方式运作。
indexList
是Arraylist
(数据未存储在输入顺序中)可能没有相应的索引值。
的实施例强>
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)