1

我很抱歉为现在许多人创建了一个类似的线程,但我主要还是想了解一些方法。

我有一个字符串列表(可能只有 1 个或超过 1000 个)格式 = XXX-XXXXX-XX 其中每个都是字母数字

我正在尝试生成一个唯一的字符串(当前长度为 18,但可能会更长,以确保不会最大化文件长度或路径长度),如果我有相同的列表,我可以重现该字符串。顺序无关紧要;虽然我可能会感兴趣,如果它也更容易限制订单。

我当前的 Java 代码如下(今天失败了,因此我在这里):


public String createOutputFileName(ArrayList alInput, EnumFPFunction efpf, boolean pHeaders) {
    /* create file name based on input list */
    String sFileName = "";
    long partNum = 0;

    for (String sGPN : alInput) {
        sGPN = sGPN.replaceAll("-", ""); //remove dashes
        partNum += Long.parseLong(sGPN, 36);    //(base 36)
    }
    sFileName = Long.toString(partNum);
    if (sFileName.length() > 19) {
        sFileName.substring(0, 18); //Max length of 19
    }
    return alInput;
}

所以显然只是添加它们并没有那么好我发现(也认为我应该取最后 18 位而不是前 18 位)

有什么好的方法(可能与CRC相关)可以工作吗?

为了帮助我创建密钥:前 3 个字符几乎总是数字,并且可能有很多重复(在 100 个中,可能只有 10 个不同的起始数字)这些字符是不允许的 - I,O 永远不会有一个字符然后是最后两个 alphachar 子集中的数字。

4

2 回答 2

1

我会使用系统时间。以下是您可以在 Java 中执行此操作的方法:

public String createOutputFileName() {
    long mills = System.currentTimeMillis();
    long nanos = System.nanoTime();
    return mills + " " + nanos;
}

如果您想添加有关项目及其零件编号的一些信息,当然可以!

======== 编辑:“批处理对象是什么意思” =========

class Batch {

    ArrayList<Item> itemsToProcess;
    String inputFilename; // input to external process
    boolean processingFinished;

    public Batch(ArrayList<Item> itemsToProcess) {
        this.itemsToProcess = itemsToProcess;
        inputFilename = null;
        processingFinished = false;
    }

    public void processWithExternal() {
        if(inputFilename != null || processingFinished) {
            throw new IllegalStateException("Cannot initiate process more than once!");
        }
        String base = System.currentTimeMillis() + " " + System.nanoTime();
        this.inputFilename = base + "_input";

        writeItemsToFile();

        // however you build your process, do it here
        Process p = new ProcessBuilder("myProcess","myargs", inputFilename);

        p.start();
        p.waitFor();
        processingFinished = true;
    }

    private void writeItemsToFile() {
        PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(inputFilename)));
        int flushcount = 0;
        for(Item item : itemsToProcess) {
            String output = item.getFileRepresentation();
            out.println(output);
            if(++flushcount % 10 == 0) out.flush();
        }
        out.flush();
        out.close();
    }

}
于 2011-02-23T23:13:57.577 回答
0

除了 GlowCoder 的回应之外,我还想到了另一个可行的“体面”。

我不只是在 base 36 中添加列表,而是对同一个列表做两件事。

在这种情况下,由于没有办法处理负数或十进制数,因此将每个数字相加并分别乘以每个数字并连接这些 base36 数字字符串也不是一个坏方法。

就我而言,我会取加数的最后九位数字和乘数的最后九位数字。这将消除我以前的错误并使其非常健壮。一旦溢出开始发生,显然仍然可能出现错误,但在这种情况下也可以工作。扩展允许的字符串长度也会使其更加健壮。

示例代码:


    public String createOutputFileName(ArrayList alInput, EnumFPFunction efpf, boolean pHeaders) {
        /* create file name based on input list */
        String sFileName1 = "";
        String sFileName2 = "";

        long partNum1 = 0;  // Starting point for addition
        long partNum2 = 1;  // Starting point for multiplication

        for (String sGPN : alInput) {
            //remove dashes
            sGPN = sGPN.replaceAll("-", "");
            partNum1 += Long.parseLong(sGPN, 36);    //(base 36)
            partNum2 *= Long.parseLong(sGPN, 36);    //(base 36)
        }

        // Initial strings
        sFileName1 = "000000000" + Long.toString(partNum1, 36);   // base 36
        sFileName2 = "000000000" + Long.toString(partNum2, 36);   // base 36

        // Cropped strings
        sFileName1 = sFileName1.substring(sFileName1.length()-9, sFileName1.length());
        sFileName2 = sFileName2.substring(sFileName2.length()-9, sFileName2.length());

        return sFileName1 + sFileName2;
    }
于 2011-02-25T14:56:05.207 回答