2

我想在 java 中创建一个生成器类,以生成下一个最小的唯一 ascii 字符串,其中生成的字符串必须以 aZ 开头,并且每个后续字母可以是 aZ 或 0-9。

这些字符串用于缩小 javascript 文件中的变量。

关于执行此操作的工具的任何建议或关于您如何实现的一些粗略代码?

4

2 回答 2

1

如果您需要使用不同的字符选择,您可以使用

public static void main(String... ignored) {
    String prev = "";
    for (int i = 0; i < 40000000; i++) {
        String s = asId(i);
        if (s.length() > prev.length())
            System.out.print(prev + "\n" + s + " to ");
        prev = s;
    }
}

static char[] CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();

public static String asId(long number) {
    StringBuilder sb = new StringBuilder();
    long div = number < 52 ? 1 : 52;
    while (div <= number / 62) div *= 62;
    while (div > 0) {
        sb.append(CHARS[((int) (number / div % 62))]);
        div /= 62;
    }
    return sb.toString();
}

印刷

0 to Z
10 to ZZ
100 to ZZZ
1000 to 

您可以在 Java 中使用以下内容。

public static String asId(long number) {
    return (char) ('a' + number % 26) 
        + (number >= 26 ? Long.toString(number / 26, 36) : "");
}

如果您担心负数,您可以使用。

public static String asId(long number) {
    long lowBit = number & 1;
    long highBits = number >>> 1;
    return (char) ('a' + highBits % 13 + lowBit) 
        + (number >= 26 ? Long.toString(highBits / 13, 36) : "");
}
于 2013-01-07T19:51:31.447 回答
0

这里有一些想法(没有完全测试!!!)

import java.lang.*;
import java.util.*;

public class Test
{
    static class VariablesIterator implements Iterator<String>
    {
        private List<Character> characters = new ArrayList<Character>();

        private List<Integer> indices = new ArrayList<Integer>();

        public VariablesIterator(String start)
        {
            char[] cs = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();

            for (char c : cs)
            {
                characters.add(c);
            }

            for (int i = 0; i < start.length(); ++i)
            {
                indices.add(characters.indexOf(start.charAt(i)));
            }
        }

        public boolean hasNext()
        {
            return true;
        }

        public String next()
        {
            String current = "";

            for (int i = 0; i < indices.size(); ++i)
            {
                current += characters.get(indices.get(i));
            }

            Integer last = indices.get(indices.size() - 1);

            if (indices.size() != 1 && last != 2*26 + 10 - 1 || indices.size() == 1 && last != 2*26 - 1)
            {
                indices.set(indices.size() - 1, last + 1);
            }
            else
            {
                indices.add(0);
            }

            return current;
        }

        public void remove()
        {
            throw new UnsupportedOperationException();
        }
    }

    static class Variables implements Iterable<String>
    {
        public Iterator<String> iterator()
        {
            return new VariablesIterator("a");
        }
    }

    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);

        for (String variable : new Variables())
        {
            System.out.println(variable);
            in.nextLine();
        }
    }
}
于 2013-01-07T20:21:16.070 回答