Java 如何检查数字在长时间内是否出现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).

我想验证一个很长的数字。它必须是12位数字。如果包含0,或任何数字出现3次或以上,则该数字无效。我已经写了这段代码,如何检查是否有任何数字出现3次或以上

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,因为它只是作为一个被丢弃的密钥使用。