1

例如,如果我想保留首先出现的字符串的顺序,但我还希望第二次出现的重复项跟在输出列表中的第一个之后。例如,如果我添加: arrlist.add("bob"); arrlist.add("pat"); arrlist.add("tan"); arrlist.add("鲍勃"); arrlist.add("垫子"); arrlist.add("猫"); arrlist.add("狗"); arrlist.add("猫");

我希望输出是

String = bob
String = bob
String = pat
String = tan
String = mat
String = cat
String = cat
String = dog

这是我的代码:

package com.tutorialspoint;

import java.util.ArrayList;

public class ArrayListDemo {
    public static void main(String[] args) {

        // create an empty array list with an initial capacity
        ArrayList<String> arrlist = new ArrayList<String>();

        // use add() method to add elements in the list
        arrlist.add("bob");
        arrlist.add("pat");
        arrlist.add("tan");
        arrlist.add("bob");
        arrlist.add("mat");
        arrlist.add("cat");
        arrlist.add("dog");
        arrlist.add("cat");

        // let us print all the elements available in list
        for (String number : arrlist) {
            System.out.println("String = " + number);
        } 

        // retrieves element at 4th postion
        String retval=arrlist.get(3);
        System.out.println("Retrieved element is = " + retval); 


    }
} 
4

5 回答 5

2

您可以使用 indexOf(yourString) 获取列表中某个值的索引。您可以使用它来检查条目是否存在并在该条目之后插入值。有关更多信息,请参阅javadocs

类似的东西

if(arrlist.indexOf(myString) == -1) // Not found
   arrlist.add(myString)
else
   arrlist.add(arrlist.indexOf(myString), myString)

好吧,我做到了,给你写了代码……真丢脸。

于 2013-09-18T05:25:20.203 回答
2

这并不是真正的“保留”,因为在原始意义上,您确实输入了bob firstFourth,而不是firstsecond

我知道没有本地数据集可以实现这一点,但是,您可以使用 a LinkedHashMap(保留第一次输入键的顺序)来实现这一点,其中值是项目的次数添加:

  • 创建一个add从哈希映射中获取值或默认为 0 的方法。增加它。再次将其放在哈希图上。
  • 读取列表时,遍历映射条目集,然后为值中的数字输出一次键。

例子

public static class ReorderingList {
    private LinkedHashMap<String, Integer> items =
        new LinkedHashMap<String, Integer>();

    public void add(String item) {
        Integer value = items.get(item);
        if (value == null) value = 0;
        value++;
        items.put(item, value);
    }

    public List<String> asList() {
        List<String> result = new ArrayList<String>();
        for(Map.Entry<String, Integer> entry : items.entrySet()) {
            for (int i=0; i < entry.getValue(); i++) {
                result.add(entry.getKey());
            }
        }
        return result;
    }
}

测试

public static void main(String[] args) {
    ReorderingList rlist = new ReorderingList();

    rlist.add("bob");
    rlist.add("pat");
    rlist.add("tan");
    rlist.add("bob");
    rlist.add("mat");
    rlist.add("cat");
    rlist.add("dog");
    rlist.add("cat");

    List<String> arrlist = rlist.asList();

    // let us print all the elements available in list
    for (String number : arrlist) {
        System.out.println("String = " + number);
    } 

    // retrieves element at 4th postion
    String retval=arrlist.get(3);
    System.out.println("Retrieved element is = " + retval); 
}

测试输出:

String = bob
String = bob
String = pat
String = tan
String = mat
String = cat
String = cat
String = dog
Retrieved element is = tan

工作理念示例

于 2013-09-18T05:27:51.080 回答
0

如果您希望项目按排序顺序(按字母顺序)出来,请查看优先级队列

每次添加项目时,都会根据比较器进行添加。比较器决定排序(按字母顺序,按长度,等等)。

然后,当您打印并从队列前面删除项目时,您的项目将按顺序打印出来。

于 2013-09-18T05:38:14.687 回答
0

如果您可以使用 Guava,您可以考虑使用LinkedHashMultiset,这将直接解决您的问题,而无需将其调整为例如 NickC 提出的 LinkedHashMap。

于 2013-09-18T18:37:59.233 回答
0

只需使用Collections.sort(myArrayList);. 您正在使用ArrayListof String,因此如果您想使用其他类型的对象,则必须compare()在对象内部实现该方法才能使用Collections.sort().

查看对象排序以获得更好的解释。

于 2015-06-17T21:01:14.970 回答