JAva面接問題文字列切り取り
4146 ワード
今日は外でJavaの面接問題を見ました.文字列の切り取りについて、ここで皆さんと共有します.
タイトルは以下の通りです.
Javaでは、文字列「abcd」は文字列「abこんにちは」と同じ長さで4文字です.しかし、対応するバイト数は異なり、1つの漢字が2バイトを占めている.指定したバイト数でサブストリングを取得する方法を定義します.例えば、「abこんにちは」に対して、3バイト取ると、サブストリングはabと「あなた」の字の半分で、半分は捨てなければなりません.4バイトを取ると「abあなた」、5バイトを取るか「abあなた」を取るか.
1.gbk符号化を考える
方法1:
方法2:
2.utf-8符号化を考える
方法1:
結果:
タイトルは以下の通りです.
Javaでは、文字列「abcd」は文字列「abこんにちは」と同じ長さで4文字です.しかし、対応するバイト数は異なり、1つの漢字が2バイトを占めている.指定したバイト数でサブストリングを取得する方法を定義します.例えば、「abこんにちは」に対して、3バイト取ると、サブストリングはabと「あなた」の字の半分で、半分は捨てなければなりません.4バイトを取ると「abあなた」、5バイトを取るか「abあなた」を取るか.
1.gbk符号化を考える
方法1:
//
private String cutStringByGBK2(String str,int len){// str len
// bug
//BUG: (bei):GBK :-84 105
String resStr="";
try {
byte bs[]=str.getBytes("gbk");
int count=0; //
for(int i=0;i
テスト:@Test
public void testCutStringByGBK2() throws IOException{
String str="ad nan ";
byte bs[]=str.getBytes("gbk");
for(int i=0;i
結果:0:
1:a
2:ad
3:ad
4:ad
5:ad n
6:ad na
7:ad nan
8:ad nan
9:ad nan
10:ad nan
11:ad nan
12:ad nan
13:ad nan
14:ad nan
15:ad nan
16:ad nan
17:ad nan i
方法2:
//
private String cutStringByGBK1(String str,int len){// str len
try {
byte bs[]=str.getBytes("gbk");
int count=0;//
for(int i=len-1;i>=0;i--){
if(bs[i]<0){
count++;
}else{
break;
}
}
if(count%2==0){
return new String(bs,0,len,"gbk");
}else{
return new String(bs,0,len-1,"gbk");
}
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(" gbk ");
}
}
テスト:@Test
public void testCutStringByGBK1() throws IOException{
String str="ad nan ";
byte bs[]=str.getBytes("gbk");
for(int i=0;i
結果:0:
1:a
2:ad
3:ad
4:ad
5:ad n
6:ad na
7:ad nan
8:ad nan
9:ad nan
10:ad nan
11:ad nan
12:ad nan
13:ad nan
14:ad nan
15:ad nan
16:ad nan
17:ad nan
2.utf-8符号化を考える
方法1:
//
private String cutStringByUTF8(String str,int len){
// utf-8 3~4 。 utf-8 4
// 3 //utf-8 : :-25 -112 -78
String resStr="";
try {
byte bs[]=str.getBytes("utf-8");
int count=0; //
for(int i=0;i
テスト:@Test
public void testCutStringByUTF8_1() throws IOException{
String str="ad nan ";
byte bs[]=str.getBytes("utf-8");
for(int i=0;i
結果:
0:
1:a
2:ad
3:ad
4:ad
5:ad
6:ad n
7:ad na
8:ad nan
9:ad nan
10:ad nan
11:ad nan
12:ad nan
13:ad nan
14:ad nan
15:ad nan
16:ad nan
17:ad nan
18:ad nan
19:ad nan
20:ad nan
21:ad nan
22:ad nan
23:ad nan
メソッド2://
private String cutStringByUTF8_2(String str,int len){// str len
// utf-8 3~4 。 utf-8 4
// 3
try {
byte bs[]=str.getBytes("utf-8");
int count=0;//
for(int i=len-1;i>=0;i--){
if(bs[i]<0){
count++;
}else{
break;
}
}
return new String(bs,0,len-(count%3),"utf-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(" utf-8 ");
}
}
テスト:@Test
public void testCutStringByUTF8_2() throws IOException{
String str="ad nan ";
byte bs[]=str.getBytes("utf-8"); //
for(int i=0;i
結果:0:
1:a
2:ad
3:ad
4:ad
5:ad
6:ad n
7:ad na
8:ad nan
9:ad nan
10:ad nan
11:ad nan
12:ad nan
13:ad nan
14:ad nan
15:ad nan
16:ad nan
17:ad nan
18:ad nan
19:ad nan
20:ad nan
21:ad nan
22:ad nan
23:ad nan