数组与字符串

数组与字符串

数组是相同类型的数据按顺序组成的一种复合数据类型。通过数组名加数组下标,来使用数组中的数据。下标从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];那么第一个下标的变化范围从01,第二个下标变化范围从02。如果你将来使用了如下语句将发生异常。

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 中的一部分字符创建一个字符串对象,参数startIndexendIndex分别指定在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 的值是15n2的值5

字符串常量也可以使用length()获得长度,如:

"你的爱好".length()的值是 4

5.7 怎样判断字符串的前缀或后缀与已知的字符串是否相同

可以使用String类中的方法:

public boolean srartsWith(String  s)

判断一个字符串的前缀是否是字符串s,如:

String tom= "220302620629021"String jerry= "21079670924022"

tom.startsWith("220")的值是truejerry.startsWith("220")的值是false

可以使用String类中的方法:

public boolean endsWith(String  s)

判断一个字符串的后缀是否是字符串s,如:

String tom= "220302620629021"String jerry= "21079670924022"

tom.endsWith("021")的值是truejerry.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)的值是falsetom.equals(jerry)的值是 true

tom

0x54C78

0xAb98

We are students

We are students

jerry

5.2内存示意图


注意:tom==jerry的值是false。因为字符串是对象,tomjerry是引用。内存示意如图5.2所示。

还可以使用public boolean equalsIgnoreCase(Strin s)方法来比较一个字符串是否和字符串 s相同,但忽略大小写。

如:tom.equalsIgnoreCase(boy)的值是true

字符串对象s可以使用String类中的public int compareToString  another)方法,按辞典序与参数another指定的字符串比较大小。如果sanother相同,该方法返回值0;如果s大于another,该方法返回正值;如果s小于another,该方法返回负值,例如:

String s= "abcde"

s.compareTo("boy")的值小于0s.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方法将形如1231232.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)//s1love Tom

s2=jerry.substring(2,5)//s2lov

例子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类,该类有两个常用的构造方法:

StringTokenizerString 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型数组中从位置statrend位置的数按升序排序(类似的方法还有: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]+",");}

  }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值