【问题标题】:indexOf returning -1indexOf 返回 -1
【发布时间】:2018-02-07 15:38:03
【问题描述】:

我在一个集合中搜索一个字符串并且一直返回 -1

下面是我的代码:

Set<String> myTokens = sharedPreferences.getStringSet("myTokens", new HashSet<String>());

    if(String.valueOf(myTokens).contains(auth.getUid())){
        int i = Arrays.asList(myTokens).indexOf(auth.getUid());
        Log.w(TAG, "Index position of token is: " + String.valueOf(i) + " where the token array is: " + myTokens + "auth.getUid() is: " + auth.getUid());

我的输出:

Index position of token is: -1 where the token array is: [0o75WmAAlTcWUzxgbcleBQSVQSr1, Ztg4GOqeucd6CqNAEokUe7eRHhY2, VatU5fy1U4cgTc3uBBiGX7G7kuT2] auth.getUid() is: Ztg4GOqeucd6CqNAEokUe7eRHhY2

不知道为什么我总是得到-1,有什么想法吗?

人们建议 auth.getUid() 的值不在集合中。但是 "Ztg4GOqeucd6CqNAEokUe7eRHhY2" 出现在我放在问题底部的集合中

感谢阅读!

【问题讨论】:

  • indexOf() 在 Set 中找不到元素时返回 -1
  • 您好,感谢您的回复,值“Ztg4GOqeucd6CqNAEokUe7eRHhY2”在集合中?
  • auth.getUid() "Ztg4GOqeucd6CqNAEokUe7eRHhY2" 值未存储在 Set 这就是您获得 -1 的原因。当 Set 没有在集合中找到值时
  • 尝试打印myTokens看看
  • 为什么首先将Set 转换为StringSet 已经有一个很好用的 .contains 方法

标签: java android arrays indexof


【解决方案1】:
Arrays.asList(myTokens)

由于myTokensSet&lt;String&gt;,因此该表达式的类型为List&lt;Set&lt;String&gt;&gt;,而不是List&lt;String&gt;

由于List&lt;Set&lt;String&gt;&gt; 不能包含String 元素,indexOf(someString) 将始终返回 -1。

你应该使用

new ArrayList<>(myTokens)

而不是制作集合的副本,其中元素在评估此表达式时按其迭代顺序排列。

但是:myTokens 是(或至少,它可以是)HashSet,它是一个无序集合。因此,“索引”没有任何意义,因为如果您再次计算,无法保证索引会相同。如果集合包含该元素,则选择零是一个同样有效的策略。

【讨论】:

  • 嘿,没有注意到当我写答案时,我认为Arrays.asList 的集合过载。 +1
  • 谢谢伙计!不知道如何使用共享偏好来实现这一点lol
  • 无论如何你可以得到一个集合的索引,因为我不知道如何使用集合更改我当前的实现到数组?
  • 集合是无序的集合。 “索引”没有实际意义。
  • 这不是我说的(或者至少不是我的意思):new ArrayList&lt;&gt;(myTokens).indexOf(...)Arrays.asList(myTokensList)List&lt;List&lt;String&gt;&gt;,原因与 Arrays.asList(myTokens)List&lt;Set&lt;String&gt; 完全相同。
猜你喜欢
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 2017-04-03
  • 2012-01-25
  • 2017-06-04
  • 1970-01-01
相关资源
最近更新 更多