3

JExcel を使用していくつかの Excel 列を並べ替えようとしています。また、他のセルへの参照を見つけて、正しいセルを参照するように再マップする必要があります。大変な仕事をたくさんやったような気がしますが、つまずきにぶつかりました。

SOからリンクされているように、wikipediaでこのコードを見つけました:

 public static String toBase26(int number){
        number = Math.abs(number);
        String converted = "";
        // Repeatedly divide the number by 26 and convert the
        // remainder into the appropriate letter.
        do
        {
            int remainder = number % 26;
            converted = (char)(remainder + 'A') + converted;
            number = (number - remainder) / 26;
        } while (number > 0);

        return converted;
    }

しかし、それに 35 という数字を入れると、次のようになります。

  1. number= 35
  2. remainder= 9
  3. converted= char(9+'A')+"" = J
  4. number= (35-9)/26 = 1
  5. 1>0
  6. remainder= 1
  7. char(1+'A')= B
  8. converted= char(1+'A')+"J" = BJ

これはある意味で、基数 10 (35) = 基数 26 (19) となります。しかし、私は実際には列 AJ を参照したいと考えています。

正しい文字を出すためにどのような変更を加える必要があるのか​​、私には理解できません。紙に書き出そうとすると、以前に抽出した文字が台無しになってしまいます。たとえば、これはうまくいかないと思います。remainder最初は 8 になり、何かを見逃していない限り、それが I に変換されることを意味するからです。

これに関する任意の助けをいただければ幸いです。私は周りを見回して、これに十分な時間を無駄にしました。私はそれを機能させるための助けが欲しいだけです。

4

2 に答える 2

4

以下は、数値の 16 進表現(任意の基数) を計算する単純な Python 関数aです。10

この問題の厄介な部分は、各ステップで残りの部分1との間を10移動しているため、モジュロでそれを考慮する必要があることです。1以下のコードは、毎回数値から減算することでそれを考慮しています。次に、16 進数で0表すことができないため、非常に便利な終了条件になります0(ウィキペディアのエントリはそれを示していますλ)。

# Formats a number as a bijective base N string.
def bijective(n, base):
  chars = ''
  while n != 0:
    chars = chr((n - 1) % base + 97) + chars
    n = (n - 1) / base

  return chars

# Examples!
if __name__ == '__main__':
  base = 26
  for n in range(1, 2 * base * base):
    print('{}: {}'.format(n, bijective(n, base)))

pythonanywhereで動作を確認してください。

この gistに JavaScript バージョンを含めました。

于 2016-01-05T06:16:00.113 に答える