我有一个任务是创建一个具有未定义长度的字符串(从键盘输入数字,直到用户按下“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++;
}
答案 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);