避免在 Java 中的 string.matches() 方法中匹配相同的值两次
Avoid matching the same value twice in string.matches() method in Java
好吧,我完全重写了这个问题,因为它有效,我想知道它为什么有效。
假设我有一个数字 testNumber,其值为 567。
我想知道接下来的两个数字(shouldPassTest 和 shouldFailTest)是否相同,但在不同的 10 位。
代码如下:
int testNumber = 567;
int num1 = 5;
int num2 = 6;
int num3 = 7;
int shouldPassTest = 756;
int shouldFailTest = 777;
if(Integer.toString(shouldPassTest).matches("[5,6,7][5,6,7][5,6,7]")
{
//Do some cool stuff
}
if(Integer.toString(shouldFailTest).matches("[5,6,7][5,6,7][5,6,7]")
{
//Do some cool stuff
}
当您 运行 时会发生什么,即每个数字都从可用数字范围(5、6 和 7)中进行测试。从理论上讲,shouldFailTest 实际上应该通过测试,因为 7 符合我的三个标准之一,尽管是 3 次。
但是在测试时,777 returns 是假的。这正是我在代码中想要的结果,但我想知道 为什么 它会发生。 matches 方法是否测试以确保每个数字只匹配一次?
谢谢!
此 post 被高度编辑。在我的代码 运行 之后,我发现该方法完全符合我的要求,但现在我想知道为什么。谢谢
我会使用以下内容,因为正则表达式不是解决此问题的好方法:
public class Count {
private int value;
public Count() {
value=0;
}
void increment() {
value++;
}
void decrement() {
value--;
}
public int getValue() {
return value;
}
}
public static boolean isAnagram(int val1, int val2) {
Map<Character, Count> characterCountMap=new HashMap<>();
for(char c:Integer.toString(val1).toCharArray()) {
Count count=characterCountMap.get(c);
if(count==null) { count=new Count(); characterCountMap.put(c, count);}
count.increment();
}
for(char c:Integer.toString(val2).toCharArray()) {
Count count=characterCountMap.get(c);
if(count==null) { return false; }
else { count.decrement(); }
if(count.getValue()==0) {
characterCountMap.remove(c);
}
}
return characterCountMap.size()==0;
}
请运行:
System.out.println(Integer.toString(shouldFailTest).matches("[5,6,7][5,6,7][5,6,7]"));
查看实际 return 值。
Theoretically, shouldFailTest should actually pass the test seeing as
how 7 matches one of my three criteria, albeit 3 times.
But what happens is that 777 returns false, when tested. This is
precisely the result I wanted in my code, but I want to know why it
happened. Does the matches method test to make sure that each number
is only matched once?
不,“777”确实匹配您指定的模式“[5,6,7][5,6,7][5,6,7]”
您代码中的以下条件将计算为真。
if(Integer.toString(shouldFailTest).matches("[5,6,7][5,6,7][5,6,7]"))
好吧,我完全重写了这个问题,因为它有效,我想知道它为什么有效。
假设我有一个数字 testNumber,其值为 567。
我想知道接下来的两个数字(shouldPassTest 和 shouldFailTest)是否相同,但在不同的 10 位。
代码如下:
int testNumber = 567;
int num1 = 5;
int num2 = 6;
int num3 = 7;
int shouldPassTest = 756;
int shouldFailTest = 777;
if(Integer.toString(shouldPassTest).matches("[5,6,7][5,6,7][5,6,7]")
{
//Do some cool stuff
}
if(Integer.toString(shouldFailTest).matches("[5,6,7][5,6,7][5,6,7]")
{
//Do some cool stuff
}
当您 运行 时会发生什么,即每个数字都从可用数字范围(5、6 和 7)中进行测试。从理论上讲,shouldFailTest 实际上应该通过测试,因为 7 符合我的三个标准之一,尽管是 3 次。
但是在测试时,777 returns 是假的。这正是我在代码中想要的结果,但我想知道 为什么 它会发生。 matches 方法是否测试以确保每个数字只匹配一次?
谢谢!
此 post 被高度编辑。在我的代码 运行 之后,我发现该方法完全符合我的要求,但现在我想知道为什么。谢谢
我会使用以下内容,因为正则表达式不是解决此问题的好方法:
public class Count {
private int value;
public Count() {
value=0;
}
void increment() {
value++;
}
void decrement() {
value--;
}
public int getValue() {
return value;
}
}
public static boolean isAnagram(int val1, int val2) {
Map<Character, Count> characterCountMap=new HashMap<>();
for(char c:Integer.toString(val1).toCharArray()) {
Count count=characterCountMap.get(c);
if(count==null) { count=new Count(); characterCountMap.put(c, count);}
count.increment();
}
for(char c:Integer.toString(val2).toCharArray()) {
Count count=characterCountMap.get(c);
if(count==null) { return false; }
else { count.decrement(); }
if(count.getValue()==0) {
characterCountMap.remove(c);
}
}
return characterCountMap.size()==0;
}
请运行:
System.out.println(Integer.toString(shouldFailTest).matches("[5,6,7][5,6,7][5,6,7]"));
查看实际 return 值。
Theoretically, shouldFailTest should actually pass the test seeing as how 7 matches one of my three criteria, albeit 3 times.
But what happens is that 777 returns false, when tested. This is precisely the result I wanted in my code, but I want to know why it happened. Does the matches method test to make sure that each number is only matched once?
不,“777”确实匹配您指定的模式“[5,6,7][5,6,7][5,6,7]”
您代码中的以下条件将计算为真。
if(Integer.toString(shouldFailTest).matches("[5,6,7][5,6,7][5,6,7]"))