Java基本功练习十四(字符串和文本IO【文件读写数据、字符串生成器、String类方法、相关技巧】)
2014-12-23 20:16
746 查看
上一篇博文讲解了字符串和文本IO的基本概念,这篇博文主要讲解相关应用。
示例一:统计字符出现的次数。可以看到运用字符串相关方法,代码简洁而高效。
运行效果如图所示:
实现的源代码如下所示:
示例二:从(向)指定地址文件读(写)数据
运行效果如图所示:
实现的源代码如下:
示例三:字符串生成器的应用忽略非字母非数字的回文数判断
运行效果如图:
实现源代码如下:
示例四:判断两个s1是否是s2子串的两种方法
运行效果图:
实现源代码如下所示:
示例五:16进制到10进制转换
运行效果如图:
实现的源代码如下所示:
示例六:找出基因。生物学中用字母A、C、T和G构成的序列来对基因进行建模。基因是基因组的一个子串,基因组在三个字符ATG之后开始,在三个字符TAG、TAA、TGA之前结束。因此基因字符串的长度是3的倍数,而基因不包含任何ATG、TAG、TAA、TGA这样的三个字符。
编写一个程序,提示用户输入一个基因组,然后显示基因组中所有的基因。如果输入序列中没有找到任何基因,则显示没有基因。每个基因组分行显示。
运行效果如图所示:
实现的源代码如下所示:
总结:
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类型的变量。
其他的使用和应用,在实践中学习并加深印象。
示例一:统计字符出现的次数。可以看到运用字符串相关方法,代码简洁而高效。
运行效果如图所示:
实现的源代码如下所示:
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类型的变量。
其他的使用和应用,在实践中学习并加深印象。
相关文章推荐
- Java基本功练习十三(字符串和文本IO【相关概念、基本方法使用】)
- Java -- JDBC mysql读写大数据,文本 和 二进制文件
- JAVA基础 day22 File类的方法和应用 利用递归获取目录下的所有文件 Properties类的应用(和IO技术结合,存取配置文件) 打印流和合并流等功能类的学习应用 切割文件练习
- MySQL---数据库从入门走向大神系列(九)-用Java向数据库读写大文本/二进制文件数据
- Java基本功练习十一(递归与迭代【汉诺塔、文件大小的显示、递归的辅助方法、尾递归】)
- Java io将文本数据存储到一个文件中
- Java读写Excel文件中数据的简便方法
- Java -- JDBC mysql读写大数据,文本 和 二进制文件
- 【C/C++学院】0826-文件重定向/键盘输入流/屏幕输出流/字符串输入输出/文件读写简单操作/字符文件读写二进制与文本差别/get与getline挖掘数据/二进制与文本差别/随机位置/多线程初级
- Java基本功练习五(一维数组相关操作[声明、创建、乱序、排序、查找]和方法的重载举例[浅议])
- Java IO 文件读写相关的操作
- 【C/C++学院】0826-文件重定向/键盘输入流/屏幕输出流/字符串输入输出/文件读写简单操作/字符文件读写二进制与文本差别/get与getline挖掘数据/二进制与文本差别/随机位置/多线程初级
- 【Java基础专题】IO与文件读写---Java的IO流架构
- Linux内核中读写文件数据的方法
- JAVA读取WORD,EXCEL,PDF,TXT,RTF,HTML文件文本内容的方法示例
- Java网络编程从入门到精通(34):读写缓冲区中的数据---使用get和put方法按顺序读写单个数据
- java读取文件的两种方法:java.io和java.lang.ClassLoader
- JAVA读取WORD,EXCEL,PDF,TXT,RTF,HTML文件文本内容的方法示例
- java中读取excel文件中字符串乱码问题解决方法
- JAVA访问firebird数据库之Jaybird-2.1.6JDK_1.5+相关DLL文件+使用方法