有没有一种方法可以找到两个 5 个字符的字符串之间的 ASCII 距离

Is there an approach to finding the ASCII distance between two strings of 5 characters

我正在尝试找到一种方法来计算和打印用户输入的字符串之间的 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' 进行操作,您需要随机代码中的匹配字符。

我不确定你为什么觉得 'separate each individual character, compare them, and add them back together' 如此令人反感。从问题描述到计算机说明再到 运行,这不是一个非常清晰的映射吗?

备选方案更复杂:您可以尝试创建一个包含字母及其索引的混合对象,对其进行流处理,并使用索引查找第二个字符串中的字符。或者,您可以尝试创建一个包含两个字符的混合对象(因此,对于输入 ABCDE 和 HELLO,一个包含 A 和 H 的对象),但是您将编写更多的代码来进行设置,然后是简单的, no-streams 方式。

所以,让我们从简单的方法开始:

int difference = 0;
for (int i = 0; i < stringLength; i++) {
    char a = inString.charAt(i);
    char b = randomString.charAt(i);
    difference += difference(a, b);
}

您必须自己编写差异方法 - 但它会非常非常简单 one-liner。

尝试获取某种类型的两个集合,并从中创建一个流,其中流中的每个元素都与每个集合中的元素相匹配(因此,["HA", "EB", "LC", "LD", "OE"] 的流)通常称为 'zipping'(与流行的文件压缩算法和产品无关),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
}

使用Edit distance (Levenshtein distance)

你可以

你也可以查看

  • Levenshtein Distance on Whosebug

这是我在 MATLAB 中的代码(ASCII 距离)

function z = asciidistance(input0)

if nargin ~= 1

    error('please enter a string');

end

size0 = size(input0);

if size0(1) ~= 1

    error ('please enter a string');

end

length0 = size0(2);

rng('shuffle');

a = 32;
b = 127;

string0 = (b-a).*rand(length0,1) + a;

x = char(floor(string0));

z = (input0 - x);

ascii0 = sum(abs(z),'all');
ascii1 = abs(sum(z,'all'));

disp(ascii0);
disp(ascii1);

disp(ascii0/ascii1/length0);

end

此脚本还区分了基于每个字符的绝对 ASCII 距离与基于每个字符串的绝对 ASCII 距离,从而导致为 ASCII 距离返回两个整数。

我还包括了这两个值的限制,其值接近被比较字符串长度的倒数。这实际上近似于 运行.

时每个随机字符串生成事件的熵 E

经过标准错误检查后,脚本首先找到输入字符串的长度。 rnd 函数为随机数生成器提供种子。 ab 变量定义 ASCII table 减去非原则 table 字符,以 126 结束,包括在内。 127 实际上用作上限,以便下一行代码可以生成输入长度的随机变量字符串。以下代码行将字符串转换为 ASCII table 提供的字母数字字符。以下代码行按元素减去两个字符串并存储结果。接下来的两行代码以第一段中提到的两种方式总结了 ASCII 距离。最后,打印出这些值,并提供随机字符串生成事件的熵 E。