Java 如何在ArrayList中保持唯一值的原始顺序?

Java 如何在ArrayList中保持唯一值的原始顺序?,java,list,arraylist,Java,List,Arraylist,例如,如果我希望保留第一个出现的字符串的顺序,但我也希望第二个重复出现在输出列表的第一个之后。例如,如果我添加: 添加(“bob”); 添加(“pat”); 添加(“tan”); 添加(“bob”); 添加(“mat”); 添加(“cat”); 添加(“狗”); 添加(“cat”) 我希望输出是 String = bob String = bob String = pat String = tan String = mat String = cat String = cat String = d

例如,如果我希望保留第一个出现的字符串的顺序,但我也希望第二个重复出现在输出列表的第一个之后。例如,如果我添加: 添加(“bob”); 添加(“pat”); 添加(“tan”); 添加(“bob”); 添加(“mat”); 添加(“cat”); 添加(“狗”); 添加(“cat”)

我希望输出是

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); 


    }
} 
package com.tutorialspoint;
导入java.util.ArrayList;
公共类ArrayListDemo{
公共静态void main(字符串[]args){
//创建具有初始容量的空阵列列表
ArrayList arrlist=新的ArrayList();
//使用add()方法在列表中添加元素
添加(“bob”);
添加(“pat”);
添加(“tan”);
添加(“bob”);
添加(“mat”);
添加(“cat”);
添加(“狗”);
添加(“cat”);
//让我们打印列表中所有可用的元素
for(字符串编号:arrlist){
System.out.println(“String=“+number”);
} 
//在第4个位置检索元素
String retval=arrlist.get(3);
System.out.println(“检索到的元素为=“+retval”);
}
} 

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

类似于

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

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

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

类似于

if(arrlist.indexOf(myString) == -1) // Not found
   arrlist.add(myString)
else
   arrlist.add(arrlist.indexOf(myString), myString)
好吧,我做到了,给你写了代码……真丢脸。

这不是真正的“保存”,因为在原始意义上,你确实输入了
bob
第一个第四个,而不是第一个第二个

据我所知,没有本地数据集可以实现这一点,但是,您可以使用
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;
    }
}
这并不是真正的“保存”,因为在原始意义上,您确实输入了
bob
第一个第四个,而不是第一个第二个

据我所知,没有本地数据集可以实现这一点,但是,您可以使用
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;
    }
}

如果您希望项目按排序顺序(根据字母顺序)出现,请查看一个示例

每次添加项目时,它都是基于比较器的值添加的。比较器决定顺序(按字母顺序,按长度,随便什么)


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

如果您希望项目按排序顺序(按字母顺序)显示,请查看

每次添加项目时,它都是基于比较器的值添加的。比较器决定顺序(按字母顺序,按长度,随便什么)


那么,当你从队列的前面打印和删除条目时,你的条目会按顺序打印出来。

< P>如果你可以使用番石榴,你可以考虑使用A,这将直接解决你的问题,而不需要将它改编成如NICC提出的Link KekdHaMax。

< P>如果你可以使用番石榴,你可以考虑使用A,这将直接解决您的问题,而无需对其进行调整,例如NickC提出的LinkedHashMap。

只需使用
集合。排序(myArrayList)。您使用的是
String的
ArrayList
,因此如果您想使用其他类型的对象,您必须在对象内部实现
compare()
方法来使用
Collections.sort()


请查看以获得更好的解释。

只需使用
Collections.sort(myArrayList)。您使用的是
String的
ArrayList
,因此如果您想使用其他类型的对象,您必须在对象内部实现
compare()
方法来使用
Collections.sort()


请看一看,以获得更好的解释。

您的英语似乎进展得相当顺利!你的意思是你想让项目按排序的顺序打印出来吗?是的,我想,但举例来说,如果我添加了字符串1)苹果2)香蕉3)苹果4)芒果,而不是输出相同的顺序,我想让副本跟随它的第一个副本,所以我想让它输出:苹果,苹果,香蕉,芒果只是为了弄清楚:如果我添加了{苹果,香蕉,苹果,芒果}你想要打印列表:苹果,苹果,香蕉,芒果,或者,你可能想要相同的元素彼此相邻。如果我添加{苹果,香蕉,芒果,猕猴桃,香蕉}你想要打印:苹果,香蕉,香蕉,芒果,猕猴桃,是的