您的位置:首页 > 编程语言 > Java开发

Java基本功练习十四(字符串和文本IO【文件读写数据、字符串生成器、String类方法、相关技巧】)

2014-12-23 20:16 746 查看
上一篇博文讲解了字符串和文本IO的基本概念,这篇博文主要讲解相关应用。

示例一:统计字符出现的次数。可以看到运用字符串相关方法,代码简洁而高效。

运行效果如图所示:


实现的源代码如下所示:

package Blog;

import java.util.Date;
import java.util.Scanner;

import javax.swing.*;

public class blogTryProject{
//统计输入字符串中每个字母,高效简洁的代码(运用了各种字符串的处理功能函数和类方法等)
public static void main(String[]args){
Scanner input = new Scanner(System.in);
System.out.print("Enter a string: ");
String s = input.nextLine();
int[] counts = countLetters(s.toLowerCase());
for(int i = 0;i < counts.length;i++){
if(counts[i] != 0)
System.out.println((char)('a'+i)+" appears "+
counts[i] + ((counts[i] == 1) ? " time" : " times"));
}
}
public static int[] countLetters(String s){
int[] counts = new int[26];
for(int i = 0;i < s.length();i++){
if(Character.isLetter(s.charAt(i)))
counts[s.charAt(i) - 'a']++;
}
return counts;
}
}


示例二:从(向)指定地址文件读(写)数据

运行效果如图所示:


实现的源代码如下:

package Blog;

import java.util.Date;
import java.util.Scanner;

import javax.swing.*;

public class blogTryProject{
//从(向)文件中读(写)数据
public static void main(String[]args)throws Exception{
WriteDate wr = new WriteDate();
wr.main(args);

System.out.println("写入数据之后scores.txt中的数据为:");
ReadData rd = new ReadData();
rd.main(args);
}
}

class WriteDate{
public static void main(String[]args) throws Exception{
java.io.File file = new java.io.File("C:\\Users\\HarryKate\\Desktop\\scores.txt");
if(file.exists()){
System.out.println("File already exsists");
Scanner input = new Scanner(file);
String s = input.nextLine();
System.out.println("scores.txt中原始数据为: "+s);
}
java.io.PrintWriter output = new java.io.PrintWriter(file);
output.print("John T Smith ");
output.println(90);
output.print("Eric k Jones ");
output.println(85);
output.close();
}
}
class ReadData{
public static void main(String[]args)throws Exception{
java.io.File file = new java.io.File("scores.txt");
Scanner input = new Scanner(file);
while(input.hasNext()){
String firstName = input.next();
String mi = input.next();
String lastName = input.next();
int score = input.nextInt();
System.out.println(firstName+" "+mi+" "+lastName+" "+score);
}
input.close();
}
}


示例三:字符串生成器的应用忽略非字母非数字的回文数判断

运行效果如图:







实现源代码如下:

package Blog;

import java.util.Date;
import java.util.Scanner;

import javax.swing.*;

public class blogTryProject{
//字符串生成器的应用,忽略非字母和非数字的回文数判断
public static void main(String[]args){
Scanner input = new Scanner(System.in);
System.out.print("Enter a string: ");
String s = input.nextLine();
System.out.println("Ignoring nonalphanumeric characters is "
+s+" a palindrome? "+isPalindrome(s));
}
public static boolean isPalindrome(String s){
String s1 = filter(s);
String s2 = reverse(s);
return s2.equals(s1);
}
public static String filter(String s){
StringBuilder stringBuilder = new StringBuilder();
for(int i = 0;i < s.length();i++){
if(Character.isLetterOrDigit(s.charAt(i)))
stringBuilder.append(s.charAt(i));
}
return stringBuilder.toString();
}
public static String reverse(String s){
String s1 = filter(s);
StringBuilder stringBuilder = new StringBuilder(s1);
stringBuilder.reverse();
return stringBuilder.toString();
}
}


示例四:判断两个s1是否是s2子串的两种方法

运行效果图:


实现源代码如下所示:

package Blog;

import java.util.Date;
import java.util.Scanner;

import javax.swing.*;

public class blogTryProject{
//判断s1是否是s2的子串两种实现方法的对比
public static void main(String[]args){
Scanner input = new Scanner(System.in);
System.out.print("Enter two strings: ");
String s1 = input.next();
String s2 = input.next();
System.out.println(s1+" is the sunString of "+s2+" ? "+indexOfMine(s1,s2));
System.out.println(s1+" is the sunString of "+s2+" ? "+indexOf(s1,s2));
}
//全部自己写,不用库类
public static boolean indexOfMine(String s1,String s2){
boolean flagForSame = false;
int s1Len = s1.length();
int s2Len = s2.length();
if(s1Len > s2Len)
return false;
else{
int jcount = 0;
int countForSame = 0;
int i = 0,j = 0;

while(true){
for(i = 0;i < s1Len;i++){
for(j = jcount;j < s2Len;j++){
if(s1.charAt(i) == s2.charAt(j)){
jcount = j + 1;
countForSame++;
break;
}
else{
if(countForSame != 0)
{i = -1;countForSame = 0;jcount = j + 1;break;}
else
continue;
}
}//for2
}//for1
if(countForSame == s1Len)
flagForSame = true;
if(i == s1Len - 1 || j == s2Len - 1 || flagForSame)
break;
}//while
}//else
return flagForSame;
}
//运用库类,简洁方便
public static boolean indexOf(String s1,String s2){
boolean flagForSame = false;
if(s1.length() > s2.length())
return false;
else{
for(int i = 0;i < s2.length() - s1.length() + 1;i++){
String s = s2.substring(i, s1.length() + i);
if(s.equals(s1)){
flagForSame = true;
break;
}
else
continue;
}
return flagForSame;
}
}
}

示例五:16进制到10进制转换

运行效果如图:


实现的源代码如下所示:

package Blog;

import java.util.Date;
import java.util.Scanner;

import javax.swing.*;

public class blogTryProject{
//16进制数转换成10进制数
public static void main(String[]args){
Scanner input = new Scanner(System.in);
System.out.print("Enter a hex number: ");
String hex = input.nextLine();
System.out.println("The decimal value for hex number "+hex+" is "
+hexToDecimal(hex.toUpperCase()));
}
public static int hexToDecimal(String hex){
int decimalValue = 0;
for(int i = 0;i < hex.length();i++){
char hexChar = hex.charAt(i);
decimalValue = decimalValue * 16 + hexCharToDecimal(hexChar);
}
return decimalValue;
}
public static int hexCharToDecimal(char ch){
if(ch >= 'A' && ch <= 'F')
return 10 + ch - 'A';
else
return ch - '0';
}
}


示例六:找出基因。生物学中用字母A、C、T和G构成的序列来对基因进行建模。基因是基因组的一个子串,基因组在三个字符ATG之后开始,在三个字符TAG、TAA、TGA之前结束。因此基因字符串的长度是3的倍数,而基因不包含任何ATG、TAG、TAA、TGA这样的三个字符。

编写一个程序,提示用户输入一个基因组,然后显示基因组中所有的基因。如果输入序列中没有找到任何基因,则显示没有基因。每个基因组分行显示。

运行效果如图所示:





实现的源代码如下所示:

package Blog;

import java.util.Date;
import java.util.Scanner;

import javax.swing.*;

public class blogTryProject{
//找出基因
public static void main(String[]args){
Scanner input = new Scanner(System.in);
System.out.print("Enter a genome string : ");
String s = input.nextLine();
int index = 0;
int newindex = 0;
boolean flagForFirst = true;//是否有基因存在判断标志
//基因存在判断
while(true){
index = s.indexOf("ATG",newindex);
//如果找不到或超出字符串范围结束判断
if(!(index < s.length() - 2 && index >= 0)){
if(flagForFirst){
System.out.println("no gene is found!");
break;
}
else
break;
}
//将三个字符组合成基因
StringBuilder sb = new StringBuilder();
sb.append(s.charAt(index+3));
sb.append(s.charAt(index+4));
sb.append(s.charAt(index+5));
String stringForGenome = sb.toString();
//是否是结束基因
if(stringForGenome == "TAG" || stringForGenome == "TAA"
|| stringForGenome == "TGA")
break;
else{
while(true){
sb = new StringBuilder();
sb.append(s.charAt(index+3));
sb.append(s.charAt(index+4));
sb.append(s.charAt(index+5));
stringForGenome = sb.toString();
if(stringForGenome.equals("TAG") || stringForGenome.equals("TAA")
|| stringForGenome.equals("TGA"))
break;
else{
System.out.print(stringForGenome);
flagForFirst = false;
}
index = index + 3;//继续判断后三位字符是否是基因
}
}
newindex = index + 3;//从新的基因点出发继续判断
System.out.println();//第一段基因结束,换行
}
}
}


总结:

1.String和StringBuilder作为给方法参数

String和StringBuilder类型的变量作为给方法的参数传递时,是有很大区别的。String传的是引用,方法返回时,原字符串的值不改变;而StringBuilder传的也是引用,但是其本身是要改变字符串生成器类型变量的值的。所以两种方式都不做返回处理时,String的变量不变,而StringBuilder的变量会改变。

2.Java进制转换库方法

二进制转换成十进制可以用Integer.parseInt(“10001”,2);来快捷实现。

另外诸如其他进制的转换,比如二进制转换成十六进制,可以用如下的方法:

String s = Integer.toHexString(int i);十进制到十六进制转换

String s = Integer.toBinaryString(int i);十进制到二进制转换

String s = Integer.toOctalString(int i);十进制到八进制的转换

而其他进制转换成十进制可统一由如下方法做到:

Int number = Integer.parseInt(Strings,int2/8/16);若输入不是String型变量,比如是int型或char型可以用String.valueOf(double/char)变成String类型的变量。

其他的使用和应用,在实践中学习并加深印象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐