【问题标题】:Values get interchanged while converting from ArrayList to Array android从 ArrayList 转换为 Array android 时值互换
【发布时间】:2014-07-16 07:27:19
【问题描述】:

我有一个包含一些元素的 ArrayList。此列表中的项目是重复的。我想将相似的值分组并将其转换为数组。

目前我的 ArrayList 是:-

ArrayList<String> isonC = new ArrayList<String>();

isoC 的值 = `[a, a, a, a, b, c, c,C, c, c, c, d, d, d, d, d, d,d] 我把so分组:-

icons = isonC.toArray(new String[isonC.size()]);
icons = new HashSet<String>(Arrays.asList(icons)).toArray(new String[0]);

我得到的值是:- 图标 = [a, c, b,d]

而元素的实际顺序应该是:-

[a,b, c,d]

为什么第二个和第三个值互换了?

任何建议都会有所帮助。 谢谢

【问题讨论】:

  • 删除重复元素后重新排序项目(按字典顺序)是否足够?
  • @JaeHeonLee 不是真的.. 我有给定的颜色数组,其顺序需要是这样的
  • 您使用的是HashSetHashSet 不保持顺序,文档说 “它不保证集合的迭代顺序;特别是,它确实不保证订单会随着时间的推移保持不变” (docs.oracle.com/javase/7/docs/api/java/util/HashSet.html)

标签: java android arrays arraylist


【解决方案1】:

尝试使用TreeSet 代替 HashSet。试试下面的方法:-

TreeSet<String> mySet =  new TreeSet <String>(myArrayList);
myArray =  mySet.toArray(new String[mySet.size()]);

【讨论】:

    【解决方案2】:

    documentationLinkedHashSet

    Set 接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与 HashSet 的不同之处在于它维护一个双向链表,该列表贯穿其所有条目。该链表定义了迭代顺序,即元素插入集合的顺序(插入顺序)。请注意,如果将元素重新插入集合中,则插入顺序不会受到影响。 (如果在调用 s.contains(e) 将在调用之前立即返回 true 时调用 s.add(e),则元素 e 将重新插入集合 s。)

    因此,假设您希望在 oldArray 中较早出现的项目在 newArray 中出现较早:

    String[] newArray = new LinkedHashSet<String>(Arrays.asList(oldArray)).toArray(new String[0]);
    

    【讨论】:

    • 我试过 LinkedHashSet 但不知何故我得到了相同的结果,除了最后两个项目被交换了
    • @user3146095:如果我使用您的示例输入尝试此操作(并且大写 C 更改为小写 c),我会得到正确的顺序。您确定原始 ArrayList 中的排序是正确的吗?也许这是 LinkedHashSet 文档中提到的“重新插入”的情况
    猜你喜欢
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 2013-02-13
    • 2017-06-02
    • 2020-04-26
    • 1970-01-01
    相关资源
    最近更新 更多