我正在尝试创建一个接受三个参数的分区函数:文本字符串,模式字符串和整数k。
目标是将长度为m的模式的内容存储在k + 1个片段的字符串数组中,其中每个片段的长度为m / k + 1(或接近)。 例如,如果字符串“ABCDEFGHIJKLMNOPQRSTUVWXYZ”被解析为k = 2的方法 数组应该看起来像这样[ABCDEFGHI,JKLMNOPQ,RSTUVWXYZ]
当m / k + 1被均匀分割时程序运行正常,但是当结果产生余数时结果关闭。我注意到这些错误似乎与m / k + 1
的余数相对应这是我遇到问题的代码的一部分:
public static String[] partition(String text, String pattern, int k) {
String[] fragment = new String[k+1];
int f = k+1;
int m = pattern.length();
int fragmentSize = (int)Math.floor(m/f);
int lastCharIndex;
// cannot partition evenly{
int i = 0;
while(i < f) {
// set the first partition as the largest
if(fragment[i] == fragment[0]) {
fragmentSize = (int)Math.ceil(m/f);
lastCharIndex = i * fragmentSize;
fragment[i] = pattern.substring(lastCharIndex, lastCharIndex+fragmentSize);
}
else {
fragmentSize = (int)Math.floor(m/f);
lastCharIndex = i * fragmentSize;
fragment[i] = pattern.substring(lastCharIndex, lastCharIndex+fragmentSize);
}
i++;
}
return fragment;
使用上面的示例我正在接收的输出是[ABCDEFGHI,IJKLMNOP,QRSTUVWX]
我觉得它与fragmentSize的显式转换有关,但我无法找到解决方法。 任何帮助将不胜感激。
答案 0 :(得分:0)
您的所有操作均使用int
,这意味着两件事:
Math.ceil
和Math.floor
的调用是无用的:他们需要一个double参数但是已经得到一个int(当你传递一个只涉及int的操作的结果时),没有楼层或ceil将被制作。在声明double
和f
时,您应该开始使用m
:
double f = (double) k+1;
double m = (double) pattern.length();
答案 1 :(得分:0)
你的逻辑错误。我们假设您有26个字母,并且需要3个片段。这使得9个元素的第一个片段,9个元素中的第二个元素和8个元素中的最后一个元素。
您的逻辑制作长度为8(floor(26 / 3)
)的每个片段,除了第一个片段长度为9(ceil(26 / 3)
)。不仅如此,还要将第一个片段的附加字母添加到第二个片段。
旁注:测试if(fragment[i] == fragment[0])
实际上应该是if (i == 0)
。你应该把你的数字加倍,以避免丢失小数部分。