生成唯一ID,最大长度为3位/字母/符号 [英] Generating unique ids with the max length of 3 digits/letters/simbols

查看:149
本文介绍了生成唯一ID,最大长度为3位/字母/符号的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有75200个单词的列表。我需要为每个单词赋予一个唯一id,每个id的长度可以是3个字母或更少。我可以使用数字,字母甚至符号,但最大长度为3。

I have a list of 75200 words. I need to give a 'unique' id to each word, and the length of each id could be 3 letters or less. I can use numbers, letters or even symbols but the max length is 3.

以下是我的代码。

import java.io.*;
import java.util.*;


public class HashCreator {

    private Map completedWordMap;
    private String [] simpleLetters = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"};
    private String[] symbols = {"!","@","#","$","%","^","&","*","~","?"};
    private String indexNumber;
    String currentlyUsingLetter, currentlyUsingSymbol;
    private int currentlyActiveSimpleLetter = 0, currentlyActiveSymbol = 0, currentlyActiveSimpleLetter2 = 0, currentlyActiveSymbol2 = 0;
    private boolean secondaryNumberIsHundred = false;

    public HashCreator()
    {
        completedWordMap = createWordNumberingMap();
    }


    private Map createWordNumberingMap()
    {
        int number = 0;
        int secondaryNumber = 0;
        int thirdinoryNumber = 0;
        Map wordMap = new HashMap();
        BufferedReader br = null;
        String str = "";
        boolean reset = false;


        //First Read The File
        File readingFile = new File("WordList/NewWordsList.txt");

        try
        {
            br = new BufferedReader(new FileReader(readingFile));

            while((str=br.readLine())!=null)
            {
                if(number<1000) //Asign numbers from 0 t0 999
                {
                    indexNumber = String.valueOf(number);
                    wordMap.put(indexNumber, str);
                    number++;
                    System.out.println(indexNumber);
                }
                else // It is 1000 now. Length exceeds so find another way.
                {
                    if(indexNumber.length()<4)
                    {
                        if(currentlyActiveSimpleLetter<simpleLetters.length) //Start using simple letter array
                        {
                            if(secondaryNumber<100) //Start combining numbers with letters. Results will look like 'a0', a1', 'a2'......'x98',x99'
                            {
                                indexNumber = simpleLetters[currentlyActiveSimpleLetter]+secondaryNumber;
                                wordMap.put(indexNumber, str);
                                secondaryNumber++;
                                System.out.println(indexNumber);

                            }
                            else
                            { 
                                //If the number is 100, that means the last result is something like 'a99','b99'...'x99'
                                //Time to use a new letter and set the counter back to 0 and select the next letter

                                secondaryNumber = 0;
                                currentlyActiveSimpleLetter++;

                            }
                        }
                        else
                        {

                            if(currentlyActiveSymbol<symbols.length) //We have used the entire alphabet. Start using sybmols now.
                            {
                                if(currentlyActiveSymbol==0) //If this is the first time we are reaching this step, reset the counter to 0
                                {
                                    secondaryNumber = 0;
                                }

                                if(secondaryNumber<100)
                                {
                                    indexNumber = symbols[currentlyActiveSymbol]+secondaryNumber;
                                    wordMap.put(indexNumber, str);
                                    secondaryNumber++;
                                    System.out.println(indexNumber);

                                }
                                else
                                {
                                    //If the number is 100, that means the last result is something like '!99','@99'...'*99'
                                    //Time to use a new letter and set the counter back to 0 and select the next symbol
                                    secondaryNumber = 0;
                                    currentlyActiveSymbol++;

                                }
                            }
                            else 
                            {
                                //We have used entire list of numbers (0-999), entire list of letters (a0-z99) and entire set of symbols (!0 - ?99)
                                //Now we need to combine all 3 together.


                                if(thirdinoryNumber<10)//We are starting with a new 'Number' counter
                                {
                                    //We again start with replacing numbers. Here the first few and last few results will look like  a!0'.....'a!9'

                                        indexNumber = simpleLetters[currentlyActiveSimpleLetter2]+symbols[currentlyActiveSymbol]+thirdinoryNumber;
                                        wordMap.put(indexNumber, str);
                                        thirdinoryNumber++;
                                        System.out.println(indexNumber);

                                        thirdinoryNumber++;
                                }
                                else
                                {
                                    //We have used number from 0-9. Time to start replacing letters

                                    if(currentlyActiveSimpleLetter2<simpleLetters.length)
                                    {
                                        if(currentlyActiveSimpleLetter2==0) //If this is the 'first' time we reach this point, reset the number counter.
                                        {
                                            thirdinoryNumber = 0;
                                        }

                                        if(thirdinoryNumber<10)
                                        {
                                            indexNumber = simpleLetters[currentlyActiveSimpleLetter2]+symbols[currentlyActiveSymbol]+thirdinoryNumber;
                                            wordMap.put(indexNumber, str);
                                            thirdinoryNumber++;
                                            System.out.println(indexNumber);

                                        }
                                        else
                                        {
                                            thirdinoryNumber = 0;
                                            currentlyActiveSimpleLetter2++; //If we are at the peek of usable numbers (0-9) reset simpleletter array position to
                                                                            // 0 and numbercounter to 0

                                        }
                                    }
                                    else
                                    {
                                        //We have used number from 0-9. Time to start replacing symbols

                                        if(currentlyActiveSymbol2<symbols.length)
                                        {
                                            if(currentlyActiveSymbol2==0) //If this is the 'first' time we reach this point, reset the number counter.
                                            {
                                                thirdinoryNumber = 0;
                                            }

                                            if(thirdinoryNumber<10)
                                            {
                                                indexNumber = simpleLetters[currentlyActiveSimpleLetter2]+symbols[currentlyActiveSymbol]+thirdinoryNumber;
                                                wordMap.put(indexNumber, str);
                                                thirdinoryNumber++;
                                                System.out.println(indexNumber);

                                            }
                                            else
                                            {
                                                thirdinoryNumber = 0;
                                                currentlyActiveSymbol2++; //If we are at the peek of usable numbers (0-9) reset symbol array position to
                                                                                // 0 and numbercounter to 0

                                            }
                                        }
                                    }
                                }

                            }

                        }
                    }
                    else
                    {
                        System.out.println("Error in Somewhere. Length Exceeded");
                    }
                }

            }

            br.close();
            System.out.println("Completed");
            System.out.println(wordMap.get(0));

        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                br.close();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }


        return wordMap;

    }


}

不幸的是,这不起作用。它打印结果,结果为' z99 '后,它是一堆!0 。下面是它的一小部分:

Unfortunately this doesn't work. It prints the results, and it is bunch of !0 after the result 'z99'. Below is a small piece of it:

!0
!0
!0
!0
...
Completed
null

除了在 k99 之后,它已经生成了10-199的ID,然后正确地从 m0 开始。您可以从此处找到结果文件。

Apart from that, after k99, it has generated ids from 10-199 then started back with m0 properly. You can find the result file from here.

如您所见, wordMap.get(0)也生成 null 。这有什么不对?如果有任何其他简单的方法来生成最多3位数/字母/符号长度的75000个唯一ID,我非常乐意随之移动。

As you can see, wordMap.get(0) also generated null. What is wrong here? If there is any other simple method for generating 75000 unique ids with maximum 3 digits/letters/symbols length, I am more than happy to move with it.

推荐答案

您可以创建一个基本上将十进制数转换为您选择的基数的方法。这里我有46个符号,例如,它给出97336个唯一序列:

You could create a method that basically converts a decimal number to a base of your choice. Here I have 46 symbols for example, which gives 97336 unique sequences:

private static final String[] symbols = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h",
        "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "!", "@", "#", "$", "%", "^", "&",
        "*", "~", "?" };
public static String getSequence(final int i) {
    return symbols[i / (symbols.length * symbols.length)] + symbols[(i / symbols.length) % symbols.length]
            + symbols[i % symbols.length];
}

这篇关于生成唯一ID,最大长度为3位/字母/符号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆