Java 如何检查数字在长时间内是否出现3次或3次以上
我想验证一个很长的数字。它必须是12位数字。如果包含0,或任何数字出现3次或以上,则该数字无效。我已经写了这段代码,如何检查是否有任何数字出现3次或以上Java 如何检查数字在长时间内是否出现3次或3次以上,java,long-integer,Java,Long Integer,我想验证一个很长的数字。它必须是12位数字。如果包含0,或任何数字出现3次或以上,则该数字无效。我已经写了这段代码,如何检查是否有任何数字出现3次或以上 public boolean Valid(Long number) { String id = Long.toString(number); if(id.length() != 12) return false; if(String.valueOf(id).
public boolean Valid(Long number) {
String id = Long.toString(number);
if(id.length() != 12)
return false;
if(String.valueOf(id).contains("0"))
return false;
//check if any digit appears 3 times or more
return false;
}
编辑::刚刚意识到我误解了这里的要求,因为目标是解释任何数字出现三次或三次以上。以下是一个考虑到这一点的解决方案,以及一些更新的测试:
@Test
public void validationTest() {
//12 chars, no digit repeated more than twice
assertTrue(isValid(123456123456L));
//Digit occurs three times
assertFalse(isValid(123356123456L));
//Digit occurs four times
assertFalse(isValid(123336123456L));
//Less than 12 length
assertFalse(isValid(12L));
//More than 12 length
assertFalse(isValid(1234561234567L));
//Contains 0
assertFalse(isValid(103456123456L));
}
static boolean isValid(long in) {
final String str = String.valueOf(in);
if(str.length() != 12)
return false;
if(str.contains("0"))
return false;
return str.chars()
.mapToObj(c -> (char)c)
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.values().stream()
.noneMatch(count -> count >= 3);
}
这里有另一种方法,它的级别稍微低一点,并且不使用流。有些人可能会觉得它更具可读性:
static boolean isValid(long in) {
final String str = String.valueOf(in);
if(str.length() != 12)
return false;
final int[] digits = new int[10];
for(char c : str.toCharArray()) {
final int idx = Character.getNumericValue(c);
if(idx == 0 || ++digits[idx] >= 3)
return false;
}
return true;
}
还有一个,因为我从中得到了一些乐趣:
static boolean isValid(long in) {
if((int)(Math.log10(in)+1) != 12)
return false;
final Map<Long, Long> map = LongStream.range(0,12)
.map(i -> (in/(long)Math.pow(10,i))%10)
.boxed()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
return !map.containsKey(0L) && map.values().stream().noneMatch(count -> count >= 3);
}
编辑::刚刚意识到我误解了这里的要求,因为目标是解释任何数字出现三次或三次以上。以下是一个考虑到这一点的解决方案,以及一些更新的测试:
@Test
public void validationTest() {
//12 chars, no digit repeated more than twice
assertTrue(isValid(123456123456L));
//Digit occurs three times
assertFalse(isValid(123356123456L));
//Digit occurs four times
assertFalse(isValid(123336123456L));
//Less than 12 length
assertFalse(isValid(12L));
//More than 12 length
assertFalse(isValid(1234561234567L));
//Contains 0
assertFalse(isValid(103456123456L));
}
static boolean isValid(long in) {
final String str = String.valueOf(in);
if(str.length() != 12)
return false;
if(str.contains("0"))
return false;
return str.chars()
.mapToObj(c -> (char)c)
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.values().stream()
.noneMatch(count -> count >= 3);
}
这里有另一种方法,它的级别稍微低一点,并且不使用流。有些人可能会觉得它更具可读性:
static boolean isValid(long in) {
final String str = String.valueOf(in);
if(str.length() != 12)
return false;
final int[] digits = new int[10];
for(char c : str.toCharArray()) {
final int idx = Character.getNumericValue(c);
if(idx == 0 || ++digits[idx] >= 3)
return false;
}
return true;
}
还有一个,因为我从中得到了一些乐趣:
static boolean isValid(long in) {
if((int)(Math.log10(in)+1) != 12)
return false;
final Map<Long, Long> map = LongStream.range(0,12)
.map(i -> (in/(long)Math.pow(10,i))%10)
.boxed()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
return !map.containsKey(0L) && map.values().stream().noneMatch(count -> count >= 3);
}
这将有效地检测输入字符串和3的任何数字的出现
static class IntPtr {
int value;
}
static boolean hasRepetition(String s, int amount) {
HashMap<Character, IntPtr> map = new HashMap<>();
for(int i = 0; i < s.length(); i++) {
IntPtr ip = map.computeIfAbsent(s.charAt(i), k -> new IntPtr());
ip.value++;
if(ip.value >= amount) {
return true;
}
}
return false;
}
这将有效地检测输入字符串和3的任何数字的出现
static class IntPtr {
int value;
}
static boolean hasRepetition(String s, int amount) {
HashMap<Character, IntPtr> map = new HashMap<>();
for(int i = 0; i < s.length(); i++) {
IntPtr ip = map.computeIfAbsent(s.charAt(i), k -> new IntPtr());
ip.value++;
if(ip.value >= amount) {
return true;
}
}
return false;
}
按数字分组并按计数检查
//如果任何数字出现3次或以上,则返回false
返回id.chars.boxed
.collectCollectors.groupingByFunction.identity,Collectors.counting//按数字分组并获取计数
.values.stream.noneMatchcount->count>=3;//按计数筛选>=3
基于上述检查,可以编写代码
返回id.length==12
&& !id.0
&&id.chars.盒装
.collectCollectors.groupingByFunction.identity,Collectors.counting//按数字分组并获取计数
.values.stream.noneMatchcount->count>=3;
免责声明
虽然流是表达性的,但在复杂情况下使用时很难调试。按数字分组并按计数检查
//如果任何数字出现3次或以上,则返回false
返回id.chars.boxed
.collectCollectors.groupingByFunction.identity,Collectors.counting//按数字分组并获取计数
.values.stream.noneMatchcount->count>=3;//按计数筛选>=3
基于上述检查,可以编写代码
返回id.length==12
&& !id.0
&&id.chars.盒装
.collectCollectors.groupingByFunction.identity,Collectors.counting//按数字分组并获取计数
.values.stream.noneMatchcount->count>=3;
免责声明
虽然流是表达性的,但在复杂情况下使用时很难进行调试。好吧,您只需扫描数字并计数:
public static boolean Valid(long number) {
if (number < 1_000_000_000_000L || number >= 10_000_000_000_000L)
return false;
int[] digits = new int[10];
for (long data = number; data != 0; data /= 10) {
int digit = (int) (data % 10);
if (0 == digit)
return false;
if (++digits[digit] >= 3)
return false;
}
return true;
}
嗯,你只需扫描数字并计数:
public static boolean Valid(long number) {
if (number < 1_000_000_000_000L || number >= 10_000_000_000_000L)
return false;
int[] digits = new int[10];
for (long data = number; data != 0; data /= 10) {
int digit = (int) (data % 10);
if (0 == digit)
return false;
if (++digits[digit] >= 3)
return false;
}
return true;
}
您可以使用数组存储每个数字的出现次数,然后检查任何数字出现的次数是否超过3次,然后返回false 代码如下: 输出: 错误的 错误的 错误的
true您可以使用数组存储每个数字的出现次数,然后检查任何数字出现的次数是否超过3次,然后返回false 代码如下: 输出: 错误的 错误的 错误的
true查看字符串的indexOf方法带有2个参数的重载方法查看字符串的indexOf方法带有2个参数的重载方法始终建议不要在字符串上尝试此操作。mapToObjc->charc。对于这个问题,它可能会很好,因为它只处理0-9,但对于一般字符串,由于代码点到字符的转换不正确,这可能会导致不正确的输出。这是一个很好的一般建议,谢谢。这也可以很容易地使用boxed,因为它只被用作已丢弃的密钥。它始终建议不要在字符串上尝试此操作。mapToObjc->charc。对于这个问题,它可能会很好,因为它只处理0-9,但对于一般字符串,由于代码点到字符的转换不正确,这可能会导致不正确的输出。这是一个很好的一般建议,谢谢。这也可以很容易地使用boxed,因为它只是作为一个被丢弃的密钥使用。