数组与字符串
数组是相同类型的数据按顺序组成的一种复合数据类型。通过数组名加数组下标,来使用数组中的数据。下标从0开始排序。
5.1 声明数组
声名数组包括数组的名字、数组包含的元素的数据类型。
声明一维数组有下列两种格式:
数组元素类型 数组名字[ ];
数组元素类型[ ] 数组名字;
声明2维数组有下列两种格式:
数组元素类型 数组名字[ ][ ];
数组元素类型[ ] [ ] 数组名字;
例如:float boy[ ]; double girl [ ]; char cat[ ];
float a[ ][]; double b[ ] [ ]; char d[ ][ ];
将来数组 boy的元素可以存放float型数据。
数组的元素的类型可以是Java的任何一种类型。假如你已经定义了一个People类,那么你可以声明一个数组:
People china[ ];
将来数组 chian元素可以存放People类型数据,即People类创建的对象。
5.2 创建数组
声明数组仅仅是给出了数组名字和元素的数据类型,要想真正的使用数组必须为它分配内存空间,即创建数组。在为数组分配内存空间时必须指明数组的长度。为数组分配内存空间的格式:
数组名字 = new 数组元素的类型[数组元素的个数];
例如:boy= new float[5];
声明数组和创建数组可以一起完成,
例如: float boy[]=new float[7];
内存示意如图5.1所示。
二维数组和一维数组一样,在定义之后必须用new运算符分配内存空间,例如:
int mytwo[][];
mytwo=new int [3][5];
或
int mytwo[][]=new int[3][4];
boy |
0x785BA |
boy[0] boy[1] boy[2] boy[3] boy[4] boy[5] boy[6] |
图5.1内存模式 |
5.3 数组元素的使用
一维数组通过下标符访问自己的元素,如boy[0],boy[1]等。需要注意的是下标从0开始,因此,数组若是8个元素,下标到7为止,如果你将来使用了如下语句将发生异常。
boy[8]=384.98f;
二维数组也通过下标符访问自己的元素,如a[0][1],a[1][2]等;需要注意的是下标从0开始,比如声明创建了一个二维数组a: int a[][] =new int[2][3];那么第一个下标的变化范围从0到1,第二个下标变化范围从0到2。如果你将来使用了如下语句将发生异常。
a[2][1]=38;a[0][3]=90;
例子1
import java.applet.*; import java.awt.*;
public class Example5_1 extends Applet
{ float a[];
public void init()
{ a=new float[5];
a[0]=23.9f; a[1]=34.9f; a[2]=45f; a[3]=56.98f; a[4]=100f;
}
public void paint(Graphics g)
{g.drawString("a[0]="+a[0]+"a[1]="+a[1]+"a[2]"+a[2]+"a[3]="+a[3]+"a[4]="+ a[4],12,12);
}
}
注:有一个重要的表示数组长度的(即元素的个数)格式。如,如果创建了
float a[]=new float[6],则 a.length的值6。
5.4 数组的初始化
创建数组后,系统会给每个数组元素一个默认的值,如,float型是0.0。
我们在声明数组时同时也还可以给数组的元素一个初始值,如:
float boy[ ]={ 12.3f;23.89f,2.0f,23f,578.98f};
上述语句相当于:float boy[]=new float[5];然后
boy[0]=12.3f;boy[1]=23.89f;boy[2]=2.0f;boy[3]=23f;boy[4]=578.98f;
例如: String s[ ]={ "we", "are", "hello", "123", "who? "};
5.5 字符串
Java使用java.lang包中的String类来创建一个字符串变量,因此字符串变量是类类型变量,是一个对象。
字符串常量:如,"你好","1234.987","weqweo"。
声明字符串: String s;
创建字符串,使用String类的构造方法:String(字符串常量 ),如:
s=new String("we are students");
也可写成:s= "we are students";
声明和创建可用一步完成:
String s=new String("we are students");
或
String s= "we are students";
也可以用一个已创建的字符串创建另一个字符串,如:
String tom=String(s);
相当于
String tom= "we are students";
String类还有两个较常用构造方法:
l String (char a[]):用一个字符数组a 创建一个字符串对象,例如:
char a[3]={‘b’,’o’,’y’};
String s=new String(a);
上述过程相当于String s= "boy";
l String(char a[],int startIndex,endIndex):提取字符数组a 中的一部分字符创建一个字符串对象,参数startIndex和endIndex分别指定在a中提取字符的起止位置,例如:
char a[6]={‘s’,’t’,’b’,’u’,’s’,’n’};
String s=new String(a,2,4);(从0开始)
上述过程相当于String s= "bus";
5.6 怎样获取字符串的长度
使用String 类中的length()方法可以获取一个字符串的长度,如:
String s= "we are students"; String tom= "我们是学生" ; int n1,n2;
n1=s.length(); n2=tom.length();
那么 n1 的值是15,n2的值5。
字符串常量也可以使用length()获得长度,如:
"你的爱好".length()的值是 4。
5.7 怎样判断字符串的前缀或后缀与已知的字符串是否相同
可以使用String类中的方法:
public boolean srartsWith(String s)
判断一个字符串的前缀是否是字符串s,如:
String tom= "220302620629021";String jerry= "21079670924022"
tom.startsWith("220")的值是true;jerry.startsWith("220")的值是false。
可以使用String类中的方法:
public boolean endsWith(String s)
判断一个字符串的后缀是否是字符串s,如:
String tom= "220302620629021";String jerry= "21079670924022"
tom.endsWith("021")的值是true;jerry.startsWith("021")的值是false。
例子2
import java.applet.*;import java.awt.*;
class Example5_2 extends Applet
{ String tom;
public void init()
{ tom="220302620629021";
}
public void paint(Graphics g)
{ if((tom.startsWith("220302"))&&(tom.endsWith("1")||tom.endsWith("3")))
g.drawString("tom是吉林人,男性",10,10);
else
{}
}
}
5.8 怎样比较两个字符串
可以使用String类中的public boolean equals(String s)方法比较一字符串是否与字符串s相同。如:
String tom= "we are students"; String boy= "We are students";String jerry= "we are students";
tom.equals(boy)的值是false,tom.equals(jerry)的值是 true。
tom |
0x54C78 |
0xAb98 |
We are students |
We are students |
jerry |
图5.2内存示意图 |
注意:tom==jerry的值是false。因为字符串是对象,tom,jerry是引用。内存示意如图5.2所示。
还可以使用public boolean equalsIgnoreCase(Strin s)方法来比较一个字符串是否和字符串 s相同,但忽略大小写。
如:tom.equalsIgnoreCase(boy)的值是true。
字符串对象s可以使用String类中的public int compareTo(String another)方法,按辞典序与参数another指定的字符串比较大小。如果s与another相同,该方法返回值0;如果s大于another,该方法返回正值;如果s小于another,该方法返回负值,例如:
String s= "abcde";
s.compareTo("boy")的值小于0;s.compareTo("aba")的值大于0;
s.compareTo("abcde")的值等于0。
按辞典序比较两个字符串还可以使用public int compareToIgnoreCase(Strin s)方法,该方法忽略大小写。
5.9 怎样把字符串转化为相应的数值
1.转化为整型:
可以使用java.lang包中的Integer类将形如"12387"的字符串转化为int型数据,格式如下:
Integer.parseInt可以使用java.lang包中的Integer类将形如"12387"的字符串转化为int型数据,格式如下:
Integer.parseInt("12387");
例如,可以把字符串"6542"转化为一个 int型,再赋给一个int型变量。
int x; String s= "6542";
x=Integer.parseInt("6542");
可以使用java.lang包中的Long类将形如"12387"的字符串转化为long型数据,格式如下:
Long.parseLong("12397");
例如,可以把字符串"9876542"转化为一个 long型,再赋给一个long型变量。
long x; String s= "46046542";
x=Long.parseLong("46046542");
2.转化为float型或double型
将形如"12334.870"字符串转化为float型的格式:
Float.valueOf("12334.870").floatValue();
转化为 double型的格式:
Double.valueOf("12334.870").doubleValue();
现在我们举一个求若干个数的平均数的例子,若干个数从键盘输入。
例子3
public class Example5_3
{public static void main(String args[])
{ double n,sum=0.0 ;
for(int i=0;i<args.length;i++)
{ sum=sum+Double.valueOf(args[i]).doubleValue();
}
n=sum/args.length;
System.out.println("平均数:"+n);
}
}
这是一个应用程序,应用程序中的main方法中的参数args能接受你从键盘键入的字符串。你首先应编译上述源程序:
c:/2000/ >javac Example53.java
编译通过后,你要使用解释器java.exe来执行你的字节码文件:
C:/2000/>java Example53 "123.78" "23324.9" "213214" (回车)
这时,程序中的args[0],arg[1],arg[2]分别得到字符串"123.78","23324.9" 和"213214"。
在源程序中我们再将这些字符串转化为数值进行运算,得到所需的结果。
5.10 怎样将数值转化为字符串
可以使用String 类直接调用valueOf方法将形如123,1232.98等数值转化为字符串,如:String.valueOf(12313.9876);
再如:
float x=123.987f;
String.valueOf(x);
5.11 怎样实现字符串检索
可以使用String类的中的方法:
indexOf(String s),indexOf(String s ,int startpoint)
实现字符串的检索,这两个方法是整型的。第一个方法是从指定字符串的头开始检索返回字符串s 首次出现的位置;第二个方法则在指定字符串中从某个位置开始检索返回字符串s 首次出现的位置。如果没有检索到返回值是-1。例如:
String tom="I am a good cat";
tom.indexOf("a");//值是2。
tom.indexOf("good",2);//值是7。
tom.indexOf("a",7);//值是13。
tom.indexOf("w",2);//值是-1。
例子4
import java.applet.*;
import java.awt.*;
public class Example5_4 extends Applet
{ String tom="I am a good cat";
int x,y,z;
public void paint(Graphics g)
{ x=tom.indexOf("a");y=tom.indexOf("good",2);z=tom.indexOf("a",7);
g.setColor(Color.red);
g.drawString( ""+x+":"+y+":"+z,20,20);
}
}
5.12 怎样得到字符串的子字符串
可以使用String类的中的方法:
substring(int startpoint),substring(int start ,int end)
例如:
String jerry="I love Tom",s1,s2;
s1=jerry.substring(2);//s1是love Tom
s2=jerry.substring(2,5);//s2是lov
例子5:
import java.applet.*;
import java.awt.*;
public class Example5_5 extends Applet
{ String jerry="I love Tom",s1,s2;
public void paint(Graphics g)
{s1=jerry.substring(2);s2=jerry.substring(2,5);
g.setColor(Color.blue);
g.drawString(s1, 20,20);g.drawString(s2, 20,50);
g.drawString(jerry.substring(jerry.indexOf("love")), 20,80);
}
}
5.13 怎样替换字符串中的字符和去掉字符串的前后空格
一个字符串s 可以使用String类中的public String replace(char oldChar char newChar)方法,用参数newChar指定的字符替换s中由oldChar指定的所有字符,例如:
String s= "I mist theep ";
s.replace(t,s) ;
s中的字符t全部用s替换,s变成"I miss sheep"。
一个字符串通过调用方法trim()可以去掉该字符串的前后空格,如
String s=" I am a student ".trim();
那么s是"I am a student"。
5.14 怎样获得对象的字符串表示
在子类的讲述中我们讲过,所有的类都默认地是java.lang包中Object类的子类或间接子类。Object类有一个public 方法:toString(),一个对象通过调用该方法可以获得该对象的字符串表示。
例子6
import java.util.Date;
import java.awt.*;
public class Example5_6
{public static void main(String args[])
{ Date date=new Date();
Button button=new Button("确定");
System.out.println(date.toString());
System.out.println(button.toString());
}
}
例子6的输出结果是:
5.15 使用StringTokenizer类分析字符串
有时我们需要分析字符串并将字符串分解成可被独立使用的单词(参见第二十章例子6或第八章例子6),这些单词叫做语言符号。例如,对于字符串"We are Students ",如果我们把空格作为了该字符串的分隔符,那么该字符串有三个单词(语言符号)。而对于字符串"WE,are ,Student",如果我们把逗号作为了该字符串的分隔符,那么该字符串有三个单词(语言符号)。
当我们分析一个字符串并将字符串分解成可被独立使用的单词时,可以使用java.util包中的StringTokenizer类,该类有两个常用的构造方法:
StringTokenizer(String s):为字符串s构造一个分析器。使用默认的分隔符集合,即空格符(若干个空格被看做一个空格)、换行符、回车符、Tab符、进纸符。
StringTokenizer(String s, String delim): 为字符串s构造一个分析器。参数dilim中的字符被作为分隔符。
例如:
StringTokenizer fenxi=new StringTokenizer("we are student");或
StringTokenizer fenxi=new StringTokenizer("we ,are ; student", ", ; ");
我们把一个StringTokenizer对象称作一个字符串分析器。一个分析器可以使用nextToken()方法逐个获取字符串中语言符号(单词),每当调用nextToken()时,都将在字符串中获得下一个语言符号。通常用while循环来逐个获取语言符号,为了控制循环,我们可以使用StringTokenizer类中的hasMoreTokens()方法,只要字符串中还有语言符号,该方法就返回true,否则返回 false.另外我们还可以调用countTokens()方法得到字符串一共有多少个语言符号。
下面是一个应用程序,分析两个字符串,分别输出每个字符串的单词,并统计出单词个数。
例子7
import java.util.*;
public class Example5_7
{ public static void main(String args[])
{ String s1="I am Geng.X.y,she is my girlfriend";
String s2="Lowood?what is that?";
StringTokenizer fenxi_1=new StringTokenizer(s1," ,");//空格和逗号做分隔符。
StringTokenizer fenxi_2=new StringTokenizer(s2," ?");//问号和空格做分隔符。
int n1=fenxi_1.countTokens(),n2=fenxi_2.countTokens();
while(fenxi_1.hasMoreTokens())
{ String s=fenxi_1.nextToken();
System.out.println(s);
}
System.out.println("s1有单词:"+n1+"个");
while(fenxi_2.hasMoreTokens())
{ String s=fenxi_2.nextToken();
System.out.println(s);
}
System.out.println("s2有单词:"+n2+"个");
}
}
习 题 五
1.使用String类的public String toUpperCase()方法可以将一个字符串中的小写字母变成大写字母;使用public String toLowerCase()方法可以将一个字符串中的大写字母变成小写字母。编写一个程序,使用这个两个方法实现大小写的转换。
2.使用String类的public String concat(String str)方法可以把调用该方法的字符串与参数指定的字符串连接,把str指定的串连接到当前串的尾部获得一个新的串。编写一个程序通过连接两个串得到一个新串,并输出这个新串。
3.String类的public char[] toCharArray()方法可以把当前字符串转化为一个字符数组,该数组的长度与字符串的长度相等。阅读下列程序,并说出输出结果。
class E3
{public static void main(String args[])
{String s="We Love Java";char a[]=s.toCharArray();
int n=s.length();
System.out.print(a[0]);System.out.println(a[n-3]);
}
}
4.String类的public char charAt(int index)方法可以得到当前字符串index位置上的一个字符。说出下列程序的输出结果。
class E4
{public static void main(String args[])
{String s="中国科学技术大学";
char a=s.charAt(2),b=s.charAt(6);
System.out.print(a); System.out.println(b);
}
}
5. (1).使用java.util包中的Arrays类的静态方法:public static void sort(double a[])可以把参数a指定的double型数组按升序排序(类似的方法还有:public static void sort(byte a[]),public static void sort(char a[]),public static void sort(float a[]),public static void sort(int a[]),public static void sort(long a[]) )。
(2) 使用java.util包中的Arrays类的静态方法:public static void sort(double a[],int start,int end)可以把参数a指定的double型数组中从位置statr到end位置的数按升序排序(类似的方法还有:public static void sort(byte a[][],int start,int end),public static void sort(char a[][],int start,int end),public static void sort(float a[][],int start,int end),public static void sort(int a[][],int start,int end),public static void sort(long a[][],int start,int end) )。
说出下列程序的输出结果
import java.util.*;
class E5
{public static void main(String args[])
{int a[]={23,67,89,90,-987};
double b[]={12.89,90.87,34,678.987,-98.78,0.89};
Arrays.sort(a);Arrays.sort(b,1,4);
for(int i=0;i<=4;i++)
{System.out.print(a[i]+",");}
for(int i=0;i<b.length;i++)
{System.out.print(b[i]+",");}
}
}