我正在尝试找到一种方法来计算和打印来自用户输入的字符串之间的Ascii距离
Scanner scan = new Scanner(System.in);
System.out.print("Please enter a string of 5 uppercase characters:");
String userString = scan.nextLine();
和一个随机生成的字符串
int leftLimit = 65; // Upper-case 'A'
int rightLimit = 90; // Upper-case 'Z'
int stringLength = 5;
Random random = new Random();
String randString = random.ints(leftLimit, rightLimit + 1)
.filter(i -> (i <= 57 || i >= 65) && (i <= 90 || i >= 97))
.limit(stringLength)
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
.toString();
有没有一种方法可以计算距离而不必将两个字符串中的每个字符分开,进行比较并将它们加在一起?
顾名思义,流就是流。除非您可以严格地根据一个输入定义一个操作,否则它们将无法很好地工作:流中的一个元素,而不知道其索引或引用整个集合。
在这里,这是一个问题。毕竟,要对输入中的“ H”进行运算,您需要使用随机代码中的匹配字符。
我不确定为什么您会发现“将每个字符分开,进行比较,然后将它们重新加在一起”对您来说真是令人讨厌。从问题描述到计算机运行说明,这不是很清晰的映射吗?
替代方法更加复杂:您可以尝试创建一个既包含字母又包含索引的混合对象,在其上进行流式处理,并使用索引在第二个字符串中查找字符。另外,您可以尝试创建一个包含两个字符的混合对象(因此,对于输入ABCDE和HELLO,一个包含A和H的对象),但是您要编写更多的代码来进行设置,然后是简单的,没有流的方式。
因此,让我们从简单的方法开始:
int difference = 0;
for (int i = 0; i < stringLength; i++) {
char a = inString.charAt(i);
char b = randomString.charAt(i);
difference += difference(a, b);
}
您必须自己编写差分方法-但这将是非常非常简单的单行代码。
尝试获取两个某种形式的集合,并从中创建一个单一的流,其中流中的每个元素都与每个集合中的元素匹配(因此,的流["HA", "EB", "LC", "LD", "OE"]
)通常称为“压缩”(与流行的文件压缩算法无关)和产品),而Java并不真正支持它(还可以吗?)。有一些第三方库可以做到这一点,但是鉴于以上内容非常简单,因此我认为压缩不是您想要的。
如果绝对需要,我想我会看起来像:
// a stream of 0,1,2,3,4
IntStream.range(0, stringLength)
// map 0 to "HA", 1 to "EB", etcetera
.mapToObj(idx -> "" + inString.charAt(idx) + randomString.charAt(idx))
// map "HA" to the difference score
.mapToInt(x -> difference(x))
// and sum it.
.sum();
public int difference(String a) {
// exercise for the reader
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句