检查字符串中的每个字符是否有效
Check whether each character in string is valid
我正在尝试在 java 中创建一个方法来判断字符串是否格式正确。字符串中的每个字符都应等于预定义字符之一,除此之外别无其他。
第一个字符应等于第一个数组中的值之一。
第二个字符应等于列数组中的值之一。
第三个字符应等于行数组中的值之一。
第四个字符应等于第四个数组中的值之一。
到目前为止我有这段代码。
public static boolean formedGoodOrNot(String input) {
char[] first = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'};
int[] columns = {1, 2, 3, 4, 5, 6, 7, 8};
char[] rows = {'A', 'B', 'C', 'D'};
int[] fourth = {0, 1, 2, 3, 4, 5, 6, 7};
if(input.length()==4) {
for (int j = 0; j < first.length+1; ) {
for (int k = 0; k < columns.length+1; ) {
for (int l = 0; l < rows.length+1; ) {
for (int m = 0; m < fourth.length+1; ) {
if (input.charAt(0) == first[j]) {
if (input.charAt(1) == columns[k]) {
if (input.charAt(2) == rows[l]) {
if (input.charAt(3) == fourth[m]) {
return true;
} else{
m++;
}
} else {
l++;
}
} else{
k++;
}
} else{
j++;
}
}
}
}
}
} else{
return false;
}
return false;
}
但是,它给我一个错误
java.lang.ArrayIndexOutOfBoundsException: 12
这里有什么问题?
谢谢
您所有的索引检查都应该
< first.length;
没有
< first.length+1;
等...
例如,您的第一个数组是 0..11,而您正在访问 12。
顺便说一句,欢迎来到 Stack Overflow!
public static boolean formedGoodOrNot(String input) {
char[] first = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'};
int[] columns = {1, 2, 3, 4, 5, 6, 7, 8};
char[] rows = {'A', 'B', 'C', 'D'};
int[] fourth = {0, 1, 2, 3, 4, 5, 6, 7};
if(input.length()==4) {
for (int j = 0; j < first.length; ) {
for (int k = 0; k < columns.length; ) {
for (int l = 0; l < rows.length; ) {
for (int m = 0; m < fourth.length; ) {
if (input.charAt(0) == first[j]) {
if (input.charAt(1) == columns[k]) {
if (input.charAt(2) == rows[l]) {
if (input.charAt(3) == fourth[m]) {
return true;
} else{
m++;
}
} else {
l++;
}
} else{
k++;
}
} else{
j++;
}
}
}
}
}
} else{
return false;
}
return false;
}
正则表达式
为此您应该使用正则表达式!匹配此模式的正则表达式是:
^[a-l][1-8][A-D][0-7]$
现在您只需将其插入一个函数即可:
private static final Pattern PATTERN = Pattern.compile("^[a-l][1-8][A-D][0-7]$");
public boolean formedGoodOrNot(String input) {
return PATTERN.matcher(input).matches();
}
好了,比您的实现更具可读性和简短性!
编辑
要了解此正则表达式的工作原理,请查看解释它的 link:https://regex101.com/r/SDlnzi/1/
既然你的问题是这里有什么问题?,让我们看看:
在检查每个字符之前,您的循环是嵌套的,导致不必要的检查。提示:当第一个字符无效时,您不需要为第二个、第三个或第四个字符输入循环。
其中两个数组包含 int
,而不是 char
,但您只需将 String
中的 char
与int
个值,这不起作用。
您将计数器与 length+1
而不是 length
进行比较,因此超出了范围。 (这些数组的长度不是 length+1
,而是 length
。)
任何以至少一个有效字符开头的无效 String
都有一个无限循环,因为您只在 else
分支中递增计数器,但没有break
/return
条件部分无效 String
.
您使用了嵌套 for
循环,这对于您的问题来说不是必需的。而且 array.length + 1
导致异常抛出。应该是 array.length
.
char[] first = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'};
int[] columns = {1, 2, 3, 4, 5, 6, 7, 8};
char[] rows = {'A', 'B', 'C', 'D'};
int[] fourth = {0, 1, 2, 3, 4, 5, 6, 7};
boolean firstTest;
boolean columnTest;
boolean rowsTest;
boolean fourthTest;
if(input.length()==4) {
for (int j = 0; j < first.length; j++){
if (input.charAt(0) == first[j]){
firstTest = true;
break;
}
}
if(!firstTest)
return false;
for (int j = 0; j < columns.length; j++){
if (input.charAt(0) == columns[j]){
columnsTest= true;
break;
}
}
if(!columnTest)
return false;
// Do the same for other tests as well
// if all tests are passed
return true;
}
如果你想要一个更快的方法,你可以使用哈希集并节省循环时间。
Set<Character> first= new HashSet<>(Arrays.asList('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'));
Set<Integer> columns= new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8));
// create other sets
if(first.contains(input.charAt(0)) && columns.contains(input.charAt(1)) && /*other similar checks*/)
return true;
return false;
我正在尝试在 java 中创建一个方法来判断字符串是否格式正确。字符串中的每个字符都应等于预定义字符之一,除此之外别无其他。 第一个字符应等于第一个数组中的值之一。 第二个字符应等于列数组中的值之一。 第三个字符应等于行数组中的值之一。 第四个字符应等于第四个数组中的值之一。 到目前为止我有这段代码。
public static boolean formedGoodOrNot(String input) {
char[] first = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'};
int[] columns = {1, 2, 3, 4, 5, 6, 7, 8};
char[] rows = {'A', 'B', 'C', 'D'};
int[] fourth = {0, 1, 2, 3, 4, 5, 6, 7};
if(input.length()==4) {
for (int j = 0; j < first.length+1; ) {
for (int k = 0; k < columns.length+1; ) {
for (int l = 0; l < rows.length+1; ) {
for (int m = 0; m < fourth.length+1; ) {
if (input.charAt(0) == first[j]) {
if (input.charAt(1) == columns[k]) {
if (input.charAt(2) == rows[l]) {
if (input.charAt(3) == fourth[m]) {
return true;
} else{
m++;
}
} else {
l++;
}
} else{
k++;
}
} else{
j++;
}
}
}
}
}
} else{
return false;
}
return false;
}
但是,它给我一个错误
java.lang.ArrayIndexOutOfBoundsException: 12
这里有什么问题?
谢谢
您所有的索引检查都应该
< first.length;
没有
< first.length+1;
等...
例如,您的第一个数组是 0..11,而您正在访问 12。
顺便说一句,欢迎来到 Stack Overflow!
public static boolean formedGoodOrNot(String input) {
char[] first = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'};
int[] columns = {1, 2, 3, 4, 5, 6, 7, 8};
char[] rows = {'A', 'B', 'C', 'D'};
int[] fourth = {0, 1, 2, 3, 4, 5, 6, 7};
if(input.length()==4) {
for (int j = 0; j < first.length; ) {
for (int k = 0; k < columns.length; ) {
for (int l = 0; l < rows.length; ) {
for (int m = 0; m < fourth.length; ) {
if (input.charAt(0) == first[j]) {
if (input.charAt(1) == columns[k]) {
if (input.charAt(2) == rows[l]) {
if (input.charAt(3) == fourth[m]) {
return true;
} else{
m++;
}
} else {
l++;
}
} else{
k++;
}
} else{
j++;
}
}
}
}
}
} else{
return false;
}
return false;
}
正则表达式
为此您应该使用正则表达式!匹配此模式的正则表达式是:
^[a-l][1-8][A-D][0-7]$
现在您只需将其插入一个函数即可:
private static final Pattern PATTERN = Pattern.compile("^[a-l][1-8][A-D][0-7]$");
public boolean formedGoodOrNot(String input) {
return PATTERN.matcher(input).matches();
}
好了,比您的实现更具可读性和简短性!
编辑
要了解此正则表达式的工作原理,请查看解释它的 link:https://regex101.com/r/SDlnzi/1/
既然你的问题是这里有什么问题?,让我们看看:
在检查每个字符之前,您的循环是嵌套的,导致不必要的检查。提示:当第一个字符无效时,您不需要为第二个、第三个或第四个字符输入循环。
其中两个数组包含
int
,而不是char
,但您只需将String
中的char
与int
个值,这不起作用。您将计数器与
length+1
而不是length
进行比较,因此超出了范围。 (这些数组的长度不是length+1
,而是length
。)任何以至少一个有效字符开头的无效
String
都有一个无限循环,因为您只在else
分支中递增计数器,但没有break
/return
条件部分无效String
.
您使用了嵌套 for
循环,这对于您的问题来说不是必需的。而且 array.length + 1
导致异常抛出。应该是 array.length
.
char[] first = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'};
int[] columns = {1, 2, 3, 4, 5, 6, 7, 8};
char[] rows = {'A', 'B', 'C', 'D'};
int[] fourth = {0, 1, 2, 3, 4, 5, 6, 7};
boolean firstTest;
boolean columnTest;
boolean rowsTest;
boolean fourthTest;
if(input.length()==4) {
for (int j = 0; j < first.length; j++){
if (input.charAt(0) == first[j]){
firstTest = true;
break;
}
}
if(!firstTest)
return false;
for (int j = 0; j < columns.length; j++){
if (input.charAt(0) == columns[j]){
columnsTest= true;
break;
}
}
if(!columnTest)
return false;
// Do the same for other tests as well
// if all tests are passed
return true;
}
如果你想要一个更快的方法,你可以使用哈希集并节省循环时间。
Set<Character> first= new HashSet<>(Arrays.asList('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'));
Set<Integer> columns= new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8));
// create other sets
if(first.contains(input.charAt(0)) && columns.contains(input.charAt(1)) && /*other similar checks*/)
return true;
return false;