Java ArrayList 对象赋值

Java ArrayList Object Assignment

我不明白行“arr[c-'a']=new ArrayList();”在下面的代码中。没有它,代码将无法运行。

正在替换

List<Queue<Character>> list=arr[c-'a'];
arr[c-'a']=new ArrayList();

List<Queue<Character>> list=new ArrayList(arr[c-'a']);

可以工作。但是在大数据集上会有性能问题。

什么“arr[c-'a']=new ArrayList();”是吗?

//Given a string s and an array of strings words, return the number of words[i] that is a subsequence of s.

package test.Test;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;

class Test 
{ 
    int MatchingSubseq(String s, String[] words) {
        List<Queue<Character>>[] arr=new ArrayList[26];
        
        for(int i=0; i<26; i++)
            arr[i]=new ArrayList<>();
        
        for(String w:words){
            Queue<Character> que=new ArrayDeque<>();
            for(var c:w.toCharArray()){
                que.add(c);
            }
            arr[que.peek()-'a'].add(que);
        }
        
        int res=0;
        for(char c:s.toCharArray()){
            List<Queue<Character>> list=arr[c-'a'];
            arr[c-'a']=new ArrayList();
            for(Queue<Character> q:list){
                q.poll();
                //System.out.println(q);
                if(q.size()==0)
                    res++;
                else
                    arr[q.peek()-'a'].add(q);
            }
        }
        
        return res;
    }
            
    // Driver Program
    public static void main(String[] args)
    {
        String s = "abcde";
        String[] words = {"a","bb","acd","ace"};
            
        Test test=new Test();
        System.out.println(test.MatchingSubseq(s, words));
    }

} 

编辑: 如果注释掉“arr[c-'a']=new ArrayList();”,我将看到如下错误。它只发生在一些在线编译器中。奇怪的...

编辑: 更新了代码和输入数据集以查看错误。

问题是,下面的代码是做什么的:

arr[c-'a'] = new ArrayList();

它在数组 arr 中的索引 c - 97 处分配一个新的 ArrayList97charint 值值 'a'.

此逻辑用于通过将值 a-z 转换为索引 0-25 来访问数组,利用 char 隐含为数字数据这一事实在 Java.

中输入(16 位无符号整数)

你有一个包含 26 个条目的数组,编号从 0 到 25。

但是您正在使用该数组存储从 'a''z' 的每个字符的信息。所以对于每个字符,您需要将字母 ('a'-'z') 转换为数字 0-25,以便能够在数组中找到它。

'a'转换为0,'b'转换为1等最简单的方法,直到将'z'转换为25,就是减去值'a' .这是可行的,因为 'a' 实际上有一个数值,但您不需要知道该值就可以编写减去 'a' 的代码。

在你的代码中,c是一个char变量,c - 'a'计算的是变量c'a'.[=16中char值的差值=]

所以对于 arr[c-'a'],您是在数组的 c - 'a' 索引上分配条目。

"arr[c-'a']=new ArrayList();"就好比用一个新的ArrayList来代替旧的。如果你注释掉它,旧的 ArrayList 仍然在 arr[c-'a'] 中。在某些情况下,例如“bb”、“arr[q.peek()-'a'].add(q);”将向正在循环的 ArrayList 添加一个队列,它会抛出 ConcurrentModificationException。

"列表<队列> list=new ArrayList(arr[c-'a']);"只是创建一个旧的ArrayList的副本,所以它不会导致循环中的ConcurrentModificationException,但是你应该删除的旧Queue仍然在列表中。因此最终结果可能比你的except大。如

    String s = "abbcde";
    String[] words = {"a","bb","acd","ace", "bz"};

"arr[c-'a']=new ArrayList();"将 return 4 但“List list=new ArrayList(arr[c-'a']);”将 return 6