Java 如何计算ArrayList中的唯一值?

Java 如何计算ArrayList中的唯一值?,java,string,arraylist,unique,Java,String,Arraylist,Unique,我必须使用Java计算文本文档中的唯一单词数。首先,我必须去掉所有单词中的标点符号。我使用Scanner类扫描文档中的每个单词,并将其放入字符串ArrayList 所以,下一步就是我的问题所在!如何创建一个可以计算数组中唯一字符串数的方法 例如,如果数组包含apple、bob、apple、jim、bob;此数组中唯一值的数目为3 你可以使用Set吗?如果是这样,你可以解决你的问题哈希集不接受重复项 HashSet noDupSet = new HashSet(); noDupSet.add(y

我必须使用Java计算文本文档中的唯一单词数。首先,我必须去掉所有单词中的标点符号。我使用
Scanner
类扫描文档中的每个单词,并将其放入字符串
ArrayList

所以,下一步就是我的问题所在!如何创建一个可以计算数组中唯一字符串数的方法

例如,如果数组包含apple、bob、apple、jim、bob;此数组中唯一值的数目为3



你可以使用Set吗?如果是这样,你可以解决你的问题<代码>哈希集不接受重复项

HashSet noDupSet = new HashSet();
noDupSet.add(yourString);
noDupSet.size();
size()
方法返回唯一字数

如果您必须真正只使用
ArrayList
,那么实现的一种方法可能是

1) Create a temp ArrayList
2) Iterate original list and retrieve element
3) If tempArrayList doesn't contain element, add element to tempArrayList

您还可以创建哈希表或哈希映射。键是您的输入字符串,值是字符串在输入数组中出现的次数。O(N)时间和空间

解决方案2:

对输入列表进行排序。 类似的字符串将彼此相邻。
将列表(i)与列表(i+1)进行比较,并计算重复的数量

我建议您使用。当调用
add
方法时,它会自动过滤重复项。

用简写的方式,您可以按如下方式进行操作

    ArrayList<String> duplicateList = new ArrayList<String>();
    duplicateList.add("one");
    duplicateList.add("two");
    duplicateList.add("one");
    duplicateList.add("three");

    System.out.println(duplicateList); // prints [one, two, one, three]

    HashSet<String> uniqueSet = new HashSet<String>();

    uniqueSet.addAll(duplicateList);
    System.out.println(uniqueSet); // prints [two, one, three]

    duplicateList.clear();
    System.out.println(duplicateList);// prints []


    duplicateList.addAll(uniqueSet);
    System.out.println(duplicateList);// prints [two, one, three]
ArrayList duplicateList=新建ArrayList();
重复列表。添加(“一”);
重复列表。添加(“两个”);
重复列表。添加(“一”);
重复列表。添加(“三”);
System.out.println(重复列表);//打印[一,二,一,三]
HashSet uniqueSet=新HashSet();
uniqueSet.addAll(重复列表);
System.out.println(uniqueSet);//印刷品[二,一,三]
duplicateList.clear();
System.out.println(重复列表);//打印[]
duplicateList.addAll(唯一集);
System.out.println(重复列表);//印刷品[二,一,三]

虽然我认为集合是最简单的解决方案,但您仍然可以使用原始解决方案,只需添加一条if语句,在添加之前检查列表中是否已经存在值

if( !wordstore.contains( words.toLowerCase() )
   wordStore.add(words.toLowerCase());

然后,列表中的单词数就是唯一单词的总数(即:wordStore.size())

Java 8开始,您可以使用:

数组列表中添加元素后:

long n = wordStore.stream().distinct().count();
它将
ArrayList
转换为流,然后只计算不同的元素

此通用解决方案利用了集合抽象数据类型不允许重复这一事实。Set.add()方法特别有用,因为它返回一个布尔标志,指示“add”操作的成功。HashMap用于跟踪每个原始元素的出现情况。该算法可适用于此类问题的变化。此解决方案可产生O(n)性能

publicstaticvoidmain(字符串参数[])
{
字符串[]strArray={“abc”、“def”、“mno”、“xyz”、“pqr”、“xyz”、“def”};
System.out.printf(“原始:%s;已处理:%s\n”、Arrays.toString(strArray)、duplicates(strArray.toString());
}
公共静态哈希映射重复(字符串arr[]
{
HashSet distinctKeySet=新HashSet();
HashMap keyCountMap=新HashMap();
对于(int i=0;i
结果:


原始:[abc、def、mno、xyz、pqr、xyz、def];已处理:{pqr=1,abc=1,def=2,xyz=2,mno=1}

3种不同的可能解决方案:

  • 按照上面的建议使用HashSet

  • 创建一个临时的
    ArrayList
    并只存储唯一的元素,如下所示:

    public static int getUniqueElement(List<String> data) {
        List<String> newList = new ArrayList<>();
        for (String eachWord : data)
        if (!newList.contains(eachWord))
            newList.add(eachWord);
        return newList.size();
    }
    

  • 你能用或不能用的东西有什么限制吗?没有,他们没有限制!是的,我被允许使用HashSet。你能告诉我如何使用HashSet吗?我不必只使用ArrayList,我可以使用任何有效的东西。我可以安装一个新的HashSet并添加ArrayList中的所有字符串值吗?是的,您可以(或)直接向集合添加元素,这样您甚至不需要ArrayList。谢谢您的帮助HashSet不是因为默认情况下不允许使用以前的值而更高效吗?当然应该是这样。但是,我想给您一个不会导致您更改现有代码的选项。真的,你刚才漏掉了一句“如果”的话。就我个人而言,我不明白我为什么要用你的速记法。我可以创建一个循环,在HashSet中添加字符串值;默认情况下,哈希集不允许使用前面的值。我认为速记法更容易使用。但你更愿意选择最好的方法……:)你真的在引用什么吗?如果没有,请不要使用引号格式。如果你引用了一些东西,你需要正确地给它加上属性。这个4年前的问题已经有了答案,使用HashSet for O(1)性能。计算字符串数组中单词出现次数的算法不能回答OP的问题(不能计算数组列表中的唯一值);它也不能改善当前的解决方案。也许你误解了这个问题?谢谢你的反馈。我为这一混乱道歉。我只是想分享一个解决方案,用于计算数组中的不同元素,我认为这是有趣的/不同的,并且可能对将来可能正在研究类似问题解决方案的其他人有用。我可能应该将解决方案添加到更合适的线程中。我强烈建议不要使用方法2。与方法1和3相比,它的效率非常低,尤其是当列表的大小变得更大时。方法2是O(n^2),而方法1和3只是O(n)。这是因为对
    newList.contains
    的调用是O(n),并且
    long n = wordStore.stream().distinct().count();
    
    public static void main(String args[])
    {
      String[] strArray = {"abc", "def", "mno", "xyz", "pqr", "xyz", "def"};
      System.out.printf("RAW: %s ; PROCESSED: %s \n",Arrays.toString(strArray), duplicates(strArray).toString());
    }
    
    public static HashMap<String, Integer> duplicates(String arr[])
    {
    
        HashSet<String> distinctKeySet = new HashSet<String>();
        HashMap<String, Integer> keyCountMap = new HashMap<String, Integer>();
    
        for(int i = 0; i < arr.length; i++)
        {
            if(distinctKeySet.add(arr[i]))
                keyCountMap.put(arr[i], 1); // unique value or first occurrence
            else
                keyCountMap.put(arr[i], (Integer)(keyCountMap.get(arr[i])) + 1);
        }     
    
        return keyCountMap; 
    } 
    
    public static int getUniqueElement(List<String> data) {
        List<String> newList = new ArrayList<>();
        for (String eachWord : data)
        if (!newList.contains(eachWord))
            newList.add(eachWord);
        return newList.size();
    }
    
    long count = data.stream().distinct().count();