簡體   English   中英

任何人都可以在此Java代碼中使用charAt以及為什么使用'A'

[英]Can anyone please use of charAt here in this java code and why 'A' is used

給定在Excel工作表中顯示的列標題,請返回其對應的列號。任何人都可以解釋此語句的作用

result = result * 26 + (s.charAt(i) - 'A' + 1) 

該代碼在下面共享

int result = 0;
for (int i = 0; i < s.length(); result = result * 26 + (s.charAt(i) - 'A' + 1), i++);
return result;

字符串標題=“我的標題”;

System.out.println(title.charAt(3)); //Prints 't'
System.out.println(title.charAt(4)); //Prints 'i'

使用'A'的原因是它已更改為十進制值,您可以在ascii表( http://www.asciitable.com/ )上看到它。 在這里您可以看到“ A” = 65。

如果您想知道為什么使用結果,則應該了解for循環的作用:這是for函數的用法;

   for(part1; part2; part3)  //Head
  {
     //Body
  }

在頭部,我們分為三個部分:

當for開始時,par1僅執行1次。

part2是在每個循環開始之前執行的條件。

part3在每個循環之后執行,通常是一個計數器或使循環最終停止的東西

所以最后我們得到一個例子:

String hello = "Hello world";
for(int i = 0; i < hello.length(); i++){
      System.out.println(hello.charAt(i));
}

循環1:i = 0控制台:“ H”

循環2:i = 1控制台:“ e”

循環3:i = 2控制台:“ l”

循環4:i = 3控制台:“ l”

循環5:i = 4控制台:“ o”

循環6:i = 5控制台:“'

循環7:i = 6控制台:“ w”

循環8:i = 7控制台:“ o”

循環9:i = 8控制台:“ r”

循環10:i = 9控制台:“ l”

循環11:i = 10控制台:“ d”

在您的示例中,您必須找到for循環的每個部分,並按照與我所做的相同的方式進行操作,以了解它如何隨時間推移而發展。

第1部分:int i = 0;

第2部分:i <s.length();

第3部分:結果=結果* 26 +(s.charAt(i)-'A'+ 1),i ++;

身體:空!

如您所見, 在第3部分中我們有2條指令 ,因此它們都在每個循環之后執行,但這與執行操作相同。

for(int i = 0; i < s.length(); i++){
   result = result * 26 + (s.charAt(i) - 'A' + 1);
}

我希望這有幫助

此代碼將由大寫字母組成的字符串編碼為整數。

假設我使用以下表示形式(1,0,1)2表示二進制數字5,表示二進制數字。 如果我想用十六進制表示10,它將是(10)16而不是A 十六進制的數字18將是(1,2)16 ,依此類推。

該代碼的作用是在字符串上逐個字符地編碼,並在基數26中用數字替換每個字母。字母“ A”由1表示,“ B”由2表示,依此類推,直到“ Z”為26。因此字符串“ ABC”將表示為(1,2,3)26 ,等於1 * 26 ^ 2 + 2 * 26 + 3 = 731。

到目前為止還不錯,但是有一個陷阱。 每個位置上可能的數字位數為26,但字母將替換為1到26,而不是0到25,這將使用所有可用數字。 結果是字母Z不能在其對應的數字內表示,並以“進位1”轉到緊鄰的較高數字。

讓我舉例說明。 字符串“ AY”表示為(1, 25)26 但是“ AZ”為(1,26)26 ,實際上是(2,0)26

但是零不一定表示Z。字符串“ AYZ”表示為(1,25,26)26 ,實際上是(1,26,0)26 ,實際上是(2,0,0)26

但是我不確定'B'-'A'部分。

Java語言規范寫道:

整數類型為byteshortintlong ,其值分別為8位,16位,32位和64位有符號的二進制補碼整數,以及char,其值為16位無符號整數代表UTF-16代碼單元(第3.1節)。

那么大寫拉丁字符的UTF-16代碼單元是什么? 這些字符是Basic Latin Unicode Block的一部分,該方便地按字母順序將它們緊挨着包含。 也就是說, 'A' + 1 == 'B''A' + 2 == 'C' ,並且'A' + i - 1是拉丁字母的第i個大寫字符。 相反,給定任何大寫拉丁字符x,我們可以找到x - 'A' + 1 'A x - 'A' + 1序數。

因此,如果我們只有26個excel列,則x - 'A' + 1 'A x - 'A' + 1將找到標記為x的列的序數。

接下來的26列從“ AA”標記為“ AZ”,接下來的標記為“ BA”標記為“ BZ”,依此類推,直到“ ZA”標記為“ ZZ”。 因此,

ordinal(s) == 26 * ordinal(s.charAt(0)) + ordinal(s.charAt(1))

將其概括為任意標簽長度留給讀者練習:-)

算術運算僅對數字基元執行, shortchar除外,它們會自動擴展為int ,算術結果也是int

減去字母A可得到字母在字母中從零開始的索引,即'A'為0, 'B'為1等

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM