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
处分配一个新的 ArrayList
,97
是 char
的 int
值值 '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
我不明白行“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
处分配一个新的 ArrayList
,97
是 char
的 int
值值 'a'
.
此逻辑用于通过将值 a-z
转换为索引 0-25
来访问数组,利用 char
隐含为数字数据这一事实在 Java.
你有一个包含 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