2015-10-06 76 views
1

我想在字符串數組中找到ArrayList<String>項的索引,但每次indexOf()都給出-1索引。如何查找字符串數組中ArrayList項的索引

我不明白哪裏錯了?請檢查我的代碼並指導我。

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

@jhamon我已經檢查細.... –

+0

你collectionData是字符串[]沒有漂亮漂亮的打印作爲集合。 collectionData.toString()爲你提供[Ljava.lang.String; @ 58ceff1,它不會被搜索名稱滿足。使用收集數據的收集和結果會有所不同。 – Sebastian

回答

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

+0

其工作......謝謝 –

+1

@ Garg的真棒:) – sam

+0

你不應該在循環內使用asList。 它會每次創建一個新的LIst,所以packageName數組變大時會更慢。 –

1

使用調試器,並期待的collectionData.toString()值。 它返回的不是你的字符串列表。表示對象。從javadoc 引用:

Object類的toString方法返回一個由其中的對象是一個實例,該符號字符'@」的類的名稱的字符串,和的無符號十六進制表示法對象的哈希碼。

編輯: 哎呦,collectionData是一個數組,而不是一個列表,你應該使用

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

它將搜索collectionData列表內searchName.get(i)字符串,而不是collectionData表示其內是一個字符串(這就是爲什麼indexOf有效)。

由於searchName是字符串列表,你不需要添加toString()searchName.get(i)

+0

我嘗試collectionData.indexOf(searchName.get(i))這個,但它顯示錯誤:無法調用數組類型的indexOf(String)String [] –

+0

我編輯我的答案 – jhamon

+0

拍攝速度太快heh =) –

0

您使用collectionData.toString()其中返回[Ljava.lang.String;@15db9742。所以collectionData.toString().indexof()始終一無所獲,回到-1

爲了解決這個問題,你可以使用:

申報的ArrayList作爲

ArrayList<String>cd = new ArrayList<String>(Arrays.asList(collectionData)); 

其將String[]ArrayList然後ArrayList爲我們提供了與indexof()發現元素的設施。

然後在你的內部for循環

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

我假設在indexLIst你想對應的packageName's指數值。

我不認爲這會以你想要的方式工作。 indexListArraylist(數據未按輸入順序存儲)可能沒有對應的索引值。
例:
的packageName列表:
「com.example.dummy」, 「edu.app.reading」
所以indexList應該有值:
2,3

但它可能包含:
3,2也是因爲數據沒有按照輸入順序存儲。

如果您想保留訂單,您應該使用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; 
    } 
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)