Java分区方法

时间:2014-02-26 22:27:06

标签: java partitioning

我正在尝试创建一个接受三个参数的分区函数:文本字符串,模式字符串和整数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的显式转换有关,但我无法找到解决方法。 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

您的所有操作均使用int,这意味着两件事:

  • 他们也会产生int,你会丢失小数部分
  • 你对Math.ceilMath.floor的调用是无用的:他们需要一个double参数但是已经得到一个int(当你传递一个只涉及int的操作的结果时),没有楼层或ceil将被制作。

在声明doublef时,您应该开始使用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)。你应该把你的数字加倍,以避免丢失小数部分。