Java 将多个字符串的不同子字符串添加到树集
问题-给你n个字符串w1,w2,…,wn。设Si表示通过考虑字符串wi的所有唯一子字符串而形成的字符串集。子字符串定义为字符串中一个或多个字符的连续序列。有关子字符串的更多信息,请参见此处。设S={S1 U S2 U….Sn},即S是一组字符串,它是通过考虑所有集合S1,S2。。。。。锡 我的方法-我使用树集并直接填充它,而不是创建列表、集合和排序列表Java 将多个字符串的不同子字符串添加到树集,java,string,nullpointerexception,runtime-error,treeset,Java,String,Nullpointerexception,Runtime Error,Treeset,问题-给你n个字符串w1,w2,…,wn。设Si表示通过考虑字符串wi的所有唯一子字符串而形成的字符串集。子字符串定义为字符串中一个或多个字符的连续序列。有关子字符串的更多信息,请参见此处。设S={S1 U S2 U….Sn},即S是一组字符串,它是通过考虑所有集合S1,S2。。。。。锡 我的方法-我使用树集并直接填充它,而不是创建列表、集合和排序列表 import java.io.*; import java.util.*; import java.text.*; import java.ma
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
public class Solution
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
int cases = Integer.parseInt(in.nextLine());
String[] a = new String[cases];
int i, c;
//Adding directly to the Set prevents a larger list because you remove the duplicates
Set<String> set = new TreeSet<String>();
for( i = 0; i < cases; i++)
{
a[i] = in.nextLine();
for (c = 0; c < a[i].length(); c++)
{
for (i = 1; i <= a[i].length() - c; i++)
{
String sub = a[i].substring(c, c + i);
set.add(sub);
}
}
}
}
我遇到一个运行时错误:
Exception in thread "main" java.lang.NullPointerException
at Solution.main(Solution.java:32)
有谁能解释一下为什么会出现这个运行时错误,我应该如何避免这个空指针异常,以及为什么会发生这种情况?如果可以的话,请帮帮我。我们现在记忆力很好。但即使在过去,将同一变量用于不同目的也被认为是一种不好的做法。使用每一个为一个目的,它将是好的。代码清晰易懂,没有其他无法解释的异常:
import java.io.StringReader;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
public class Solution {
public static void main(String[] args) {
Scanner in = new Scanner(new StringReader("2\naab\naac\n"));
int cases = Integer.parseInt(in.nextLine());
String[] a = new String[cases];
//int i, c;
// Adding directly to the Set prevents a larger list because you remove
// the duplicates
Set<String> set = new TreeSet<String>();
for (int i = 0; i < cases; i++) {
a[i] = in.nextLine();
for (int c = 0; c < a[i].length(); c++) {
for (int ii = 1; ii <= a[i].length() - c; ii++) {
String sub = a[i].substring(c, c + ii);
set.add(sub);
}
}
}
System.out.println(set);
}
}
导入java.io.StringReader;
导入java.util.Scanner;
导入java.util.Set;
导入java.util.TreeSet;
公共类解决方案{
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(新StringReader(“2\naab\naac\n”);
int cases=Integer.parseInt(in.nextLine());
String[]a=新字符串[案例];
//int i,c;
//直接添加到集合中可以防止出现更大的列表,因为您删除了
//复制品
Set=新树集();
对于(int i=0;i 对于(int ii=1;ii)您可能想检查最后一次迭代的i
对于最后一次迭代的i,i=a[i].length()-c,有什么问题?@singhakashfort您初始化的最外层循环的第一次迭代a[0]
,但对于您正在访问的最内层循环a[1].length()
此处a[1]
未初始化,指针为空。为什么有相同变量名称的嵌套循环
import java.io.StringReader;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
public class Solution {
public static void main(String[] args) {
Scanner in = new Scanner(new StringReader("2\naab\naac\n"));
int cases = Integer.parseInt(in.nextLine());
String[] a = new String[cases];
//int i, c;
// Adding directly to the Set prevents a larger list because you remove
// the duplicates
Set<String> set = new TreeSet<String>();
for (int i = 0; i < cases; i++) {
a[i] = in.nextLine();
for (int c = 0; c < a[i].length(); c++) {
for (int ii = 1; ii <= a[i].length() - c; ii++) {
String sub = a[i].substring(c, c + ii);
set.add(sub);
}
}
}
System.out.println(set);
}
}