Создание уникального имени файла из списка буквенно-цифровых строк - PullRequest
1 голос
/ 24 февраля 2011

Я прошу прощения за создание аналогичного потока для многих, которые там сейчас, но я в основном хотел также получить представление о некоторых методах.

У меня есть список строк (может быть только 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 разных начальных чисел) Эти символы не допускаются - я, O Никогда не будет символа, а затем числа в последних двух подмножествах альфа-символов.

Ответы [ 2 ]

1 голос
/ 24 февраля 2011

Я бы использовал системное время. Вот как вы можете сделать это на 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();
    }

}
0 голосов
/ 25 февраля 2011

В дополнение к ответу GlowCoder, я подумал о другом "приличном", который будет работать.

Вместо того, чтобы просто добавить список в базу 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...