如何在字符串中定义数字序列?

时间:2018-02-07 10:13:08

标签: java

我有一个任务是创建一个具有未定义长度的字符串(从键盘输入数字,直到用户按下“Enter”),然后我必须定义有多少数字按顺序排列。不幸的是我无法解决这个问题。我想我差不多了,但我不是。我创建了一个字符串,我希望逐个字符地复制到数组中,然后将每个数字与下一个数字进行比较,但是我将字符复制到数组中时遇到了麻烦。

这是我的代码:

int sum = 0;
String someSymbols = sc.nextLine();
int array [] = new int[someSymbols.length()];
for(int i=0; i<someSymbols.length(); i++){
    for (int j=0; j<=array.length; j++){
        array[j] = someSymbols.charAt(i);
    }
    sum++;
}

3 个答案:

答案 0 :(得分:0)

不确定你想要达到的目标,但这里有两个灵感的例子:

取数字直到达到不同的数字。忽略非数字

String s = "22u223r5";

String digitsOnly = s.replaceAll("[^\\d.]", "");

int firstDifferentDigit = -1;
for(int i = 1; i < digitsOnly.length(); i++) {
  if(digitsOnly.charAt(i) != digitsOnly.charAt(i-1)) {
    firstDifferentDigit = i;
    break;
  }
}

System.out.println("firstDifferentDigit:"+firstDifferentDigit);
System.out.println(digitsOnly.substring(0,firstDifferentDigit));

输出

firstDifferentDigit:4
2222

取数字直到第一个非数字

String s = "124g35h6j3lk4kj56";

int firstNonDigitCharacter = -1;
for(int i = 0; i < s.length(); i++) {
  if(s.charAt(i) < '0' || s.charAt(i) > '9') {
    firstNonDigitCharacter = i;
    break;
  }
}

System.out.println("firstNonDigitCharacter:"+firstNonDigitCharacter);
System.out.println(s.substring(0,firstNonDigitCharacter));

输出

firstNonDigitCharacter:3
124

修改 这适用于您描述练习的方式:

String someSymbols = "72745123";
List<String> sequences = new ArrayList<>();

boolean inSequence = false; // will flag if we are currently within a sequence
StringBuilder currentSequence = new StringBuilder(); // this will store the numbers of the sequence

for(int i = 0; i < someSymbols.length(); i++) {
  char currentChar = someSymbols.charAt(i);
  char nextChar = 0;
  if(i < someSymbols.length()-1)
    nextChar = someSymbols.charAt(i+1);

  // if next number is 1 more than the current one, we are in a sequence
  if(currentChar == nextChar-1) {
    inSequence = true;
    currentSequence.append(String.valueOf(currentChar));

  // if next number is NOT 1 more than the current one and we are in a sequence, it is the last of the sequence
  } else if(inSequence) {
    currentSequence.append(String.valueOf(currentChar));
    sequences.add(currentSequence.toString());
    currentSequence = new StringBuilder();
    inSequence = false;
  }
}

System.out.println(sequences);

输出

[45, 123]

答案 1 :(得分:0)

我删除了我的第一个答案,因为我提出了错误的问题,认为它是关于字符序列的,其中一些恰好是数字。

尝试围绕Java8中的新功能样式,但转换很复杂,充满了陷阱。当然,这不是规范的。我想这里的收藏家可能是合适的,但我突然用递归方法做了一半的工作。

import java.util.*;
import java.util.stream.*;

String s = "123534567321468"
List<Integer> li = IntStream.range (0, s.length()-2).filter (i -> (s.charAt(i+1) != s.charAt(i)+1)).collect (ArrayList::new, List::add, List::addAll);

li.add (s.length()-1);
int maxDiff (int last, List<Integer> li , int maxdiff) {
    if (li.isEmpty ()) 
        return maxdiff;
    return maxDiff (li.get(0), li.subList (1, li.size () - 1), Math.max (li.get(0) - last, maxdiff));
}
int result = maxDiff (0, li, 0);

优雅地开始。

IntStream.range (0, s.length()-2).filter (i -> (s.charAt(i+1) != s.charAt(i)+1))
|  Expression value is: java.util.stream.IntPipeline$9@5ce81285
|    assigned to temporary variable $20 of type IntStream

-> $20.forEach (i -> System.out.println (i));
2
3
8
9
10
11
12

这是索引列表,其中数字链被打破。

 String s = "123534567321468"

123是0到2,5只是3,34567,后来的赢家是4到8,......

请注意,我们不需要将字符串转换为数字,因为字符以ASCII或UTF-X的形式逐个链接,就像数字一样。

要将其转换为List,使用复杂的collect方法,因为原始int的数组不能很好地与List一起使用。

对于最后一个间隔,必须添加li.add(s.length() - 1) - 添加元素不会对数组起作用。

maxDiff协议最大到目前为止,最后一个元素并重复从列表中取头,将其与最后一个元素进行比较以构建当前差异。

该代码在Java9的jshell中得到了验证,这是一个了不起的工具,不需要嵌入类,也不需要主要的#39;对于片段。 :)

仅作比较,这是我在scala中的解决方案:

val s = "123534567321468"
val cuts = (0 to s.length-2).filter (i => {s.charAt(i+1) != s.charAt(i)+1}).toList ::: s.length-1 :: Nil
(0 :: cuts).sliding (2, 1).map {p => p(1) - p(0)}.max

滑动(a,b)定义宽度为a = 2的窗口,其向前移动b = 1。

答案 2 :(得分:0)

非常感谢!我是在你的帮助下完成的!事实证明,任务是计算任何符号的字符串中出现的数量。就如此容易。我的错!但我很感激能成为这个论坛的一员:)

以下是代码:

    String f = sc.nextLine();
    int count = 0;
    for(int i=0; i<f.length(); i++){
        if((f.charAt(i)>='0') && (f.charAt(i)<='9')){
        count++;
        }
    }
    System.out.println("The numbers in the row are : " + count);