Java--编程练习(1)

Java常用数据类型处理类

**

1、从命令行参数中得到一个字符串,统计该字符串中字母a的出现次数

**
代码如下:

public class exam_1 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String s=args[0];  //从命令行输入(run->run configurations->Arguments)
		int count=0;
		for(int i=0;i<s.length();i++) {
			if(s.charAt(i)=='a')   //charAt(int index)用于获取字符串的第index索引个字符
				count++;
		}
		System.out.print("从命令行参数得到的字符串中,字母a出现的次数为:"+count);
	}
}

2、从键盘输入若干行文字,最后输入的一行“end”代表结束标记
(1)统计该段文字中英文字母的个数。
(2)将其中的所有英文单词the全部改为a,输出结果
(3)将该段文字的所有数字串找出来输出。
代码如下:

import java.util.Scanner;
public class exam_2 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int count=0;    //统计该段文字中的英文字母个数
		StringBuffer sbf=new StringBuffer();  //存放单词the改为a后的字符串
		Scanner scan=new Scanner(System.in);  //扫描输入
		String str=scan.nextLine();
		while(!str.equals("end")) {           
			for(int i=0;i<str.length();i++) {
				if(Character.isLetter(str.charAt(i)))
					count++;
			}
			sbf.append(str.replaceAll("the", "a")+"\n");
			str=scan.nextLine();	
		}
		System.out.println("英文字母个数:"+count);
		System.out.println("所有单词the替换成a后的结果:");
		System.out.println(sbf);
		String s=sbf.toString();
		s=s.replaceAll("[^0-9]+", ";");
		if(s.charAt(0)==';')
			s=s.substring(1);
		//String[] ss=s.split(";");
		System.out.println("该段文字中所有数字串:"+java.util.Arrays.deepToString(s.split(";")));
	}
}

运行效果如下:

注意:
1.字符串本身是一个对象,所以比较时可以用equal()方法;
2. 判断一个字符是否是英文字母可以用Character.isLetter(char ch),比常用的是否在a-z或A-Z内更方便,类似的还有Character.isDigit(char ch)判断字符是否为数字;
3. String类不能改变串对象中的内容,只能通过建立一个新串来实现串的变化,而创建对象过多既浪费内存,效率又低;而StringBuffer类就可以实现字符串内容的添加、修改和删除,一个String类转化为StringBuffer类,可以用StringBuffer(String str)方法,而StringBuffer类转化为String只需调用toString()方法。
4. s.split(";")得到的是一个字符串数组,不能直接输出,需要调用java.util.Arrays.deepToString方法,而和java.util.Arrays.ToString的区别在于:Arrays.deepToString()用于数组中还有数组的情况,而Arrays.toString()则就是用于一维的简单数组,当数组中有数组用Arrays.toString()时,不会打印出数组中的内容,只会以地址的形式打印出来。
5. replaceAll()方法用于后者替代前者正则表达式匹配到的字符串,而replace用于的字符的替换

3、编写一个简易的加密处理程序,从键盘输入一段英文文字,将其中的每个字母用其后的第4个字母代替,最后的字母轮回到前面去数。其他字符不变。

import java.util.Scanner;
public class exam_5 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.print("请输入明文:");
		Scanner scan = new Scanner(System.in);
		String str = scan.nextLine();
		StringBuffer sbf =new StringBuffer();
		for (int i = 0; i < str.length(); i++) {
			if (Character.isLetter(str.charAt(i))) {
					if (str.charAt(i) >= 'a' && str.charAt(i) <= 'z')
						sbf.append( (char) ('a' + (str.charAt(i) - 'a' + 4) % 26));
					else if (str.charAt(i) >= 'A' && str.charAt(i) <= 'Z')
						sbf.append( (char) ('A' + (str.charAt(i) - 'A' + 4) % 26));
				}
			else
				sbf.append(str.charAt(i));
		}
		System.out.print("加密后的结果为:");
		System.out.println(sbf);
	}

}

注:
1.String类中的replace或replaceAll方法都是替换字符串中找到的所有的字符或字符串,若逐个替换可能会重复被替换导致得不到我们想要的结果,对于字符串的改变还是StringBuffer比较方便,可以简单实现增删改。
2.字母之间的转换其实是ASCII码值的变换,最后需要再强制转换一下,为实现循环替换,可巧妙利用求余符号

4、编写一个程序实现扑克牌的洗牌算法,52张牌(不包括大、小王)并输出发牌结果(枚举类型)

enum cardValue{
	_A,_2,_3,_4,_5,_6,_7,_8,_9,_10,_J,_Q,_K;
}
class card{
	char cardType;
	cardValue value;
	public card(char cardType,cardValue value) {
		this.cardType=cardType;
		this.value=value;
	}
	public String toString() {
		return "花色:"+cardType+",值:"+value;
	}
}
public class exam_6 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
         char type[]= {'R','B','F','M'};  //分别代表红桃,黑桃,方块,梅花
         cardValue values[]=cardValue.values();
         card cd[]=new card[52];
         for(int i=0;i<type.length;i++) {  //初始化每张牌
        	 for(int j=0;j<values.length;j++)
        		 cd[i*13+j]=new card(type[i],values[j]);
         }
         //洗牌,每次随机选一张和第一张交换位置,1000次
         for(int k=0;k<=1000;k++) {
        	 int m=(int)(Math.random()*51+1);
        	 card temp=cd[0];
        	 cd[0]=cd[m];
        	 cd[m]=temp;
         }
         System.out.println("东\t\t南\t\t西\t\t北");
         //发牌
         for(int i=0;i<cd.length;i++) {
        	 System.out.print(cd[i]+"\t");
        	 if((i+1)%4==0)  System.out.println();
         }
         
	}

}

注:
1.用枚举类型定义扑克牌时,因为标识符不能以数字开头所以在前面加了一个下划线;
2.先初始化每张牌,洗牌的操作其实就是每次随机选一张和第一张交换位置,执行多次

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值