1.統計字符串中的各類字符的個數並對其排序java
package JavaMianSiTest; public class TongJIZiFu { public static void main(String[] args) { String str = "a12中國3@b&4語*$#@^&言3c"; String E1 = "[\u4e00-\u9fa5]";// 中文 String E2 = "[a-zA-Z]";// 英文 String E3 = "[0-9]";// 數字 int chineseCount = 0; int englishCount = 0; int numberCount = 0; String temp; for (int i = 0; i < str.length(); i++) { temp = String.valueOf(str.charAt(i)); if (temp.matches(E1)) { chineseCount++; } if (temp.matches(E2)) { englishCount++; } if (temp.matches(E3)) { numberCount++; } } System.out.println("漢字數:" + chineseCount); System.out.println("英文數:" + englishCount); System.out.println("數字數:" + numberCount); System.out.println("特殊字符:" + (str.length() - (chineseCount + englishCount + numberCount))); } }
2.文件合併git
package JavaMianSiTest; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Reader; import java.io.Writer; /** * 一、編寫一個程序,將a.txt文件中的單詞與b.txt文件中的單詞交替合併到c.txt文件中,a.txt文件中的單詞用回車符分隔,b.txt文件中用回車或空格進行分隔 * */ public class WenjianHebing { public static void main(String[] args) throws IOException { File fileA= new File("D:/eclipse項目/a.txt"); Reader readerA = new FileReader(fileA); //建立能夠一次讀取一行的輸入流 BufferedReader a = new BufferedReader(readerA); //一次讀取一行,結束符爲null File fileB= new File("D:/eclipse項目/b.txt"); Reader readerB = new FileReader(fileB); BufferedReader b = new BufferedReader(readerB); //一次讀取一行,結束符爲null String str1=a.readLine(); //用於單詞的計數 int wordsA=0; //緩衝區,能夠把讀取的單詞存進去 StringBuffer bufA= new StringBuffer(); while(str1!=null){ System.out.println("***********"+str1); str1=a.readLine(); wordsA++; if(str1!=null) bufA.append(str1); bufA.append(" "); } System.out.println("a.txt單詞數:"+wordsA); System.out.println("-------------------------"); String str2=b.readLine(); int wordsB=0; StringBuffer bufB= new StringBuffer(); while(str2!=null){ String[] st = str2.split(" "); //例如讀取的一行爲:house home desk wordsB+=st.length; for(String i :st){ bufB.append(i); //把切割後的字符放到b的緩衝區 bufB.append(" "); } System.out.println(str2); str2=b.readLine(); } System.out.println("b.txt單詞數:"+wordsB); System.out.println("A文件:"+bufA); System.out.println("B文件:"+bufB); String strA=bufA.toString(); //轉爲字符串 String strB=bufB.toString(); String []A=strA.split(" "); String []B=strB.split(" "); int total=wordsA+wordsB; String [] result=new String [total-1]; //建立一個字符串數組,能夠容納a.txt以及b.txt的單詞的總數 if(wordsA<wordsB)//只作了a文件的單詞數比b的少的,後面加個else就能夠了 { int j=0; for(int i=0;i<wordsB;i++) { result[j]=B[i]; j++; if(i<A.length) { result[j]=A[i]; j++; } } } String content =""; for(String x:result){ content+=x+" "; //把字符數組的內容轉爲字符串 } System.out.println("content:"+content); File fileC = new File("D:/eclipse項目/c.txt"); Writer w = new FileWriter(fileC); w.write(content); //把字符串寫到c.txt裏去 w.close(); //必定要關閉,否則沒法成功的 } }
3.金額轉換正則表達式
package JavaMianSiTest; /* * 金額轉換,阿拉伯數字的金額轉換成中國傳統的形式 */ public class RenMingBi { public static String convert(double inputMonney) { int decimalDigit = 2;//人名幣保留2位小數到分 //漢語中數字大寫 char[] data = {'零', '壹', '貳', '叄', '肆', '伍', '陸', '柒', '捌', '玖'}; //漢語中貨幣單位大寫,這樣的設計相似於佔位符 char[] units = {'分', '角', '元', '拾', '佰', '仟', '萬', '拾', '佰', '仟', '億', '拾', '佰', '仟','兆', '拾', '佰', '仟'}; int uint = 0; //在這裏我不使用系統函數,本身實現四捨五入,原理:如102.345,保留2位並四捨五入,102.3456->102.3456*10^(2+1)=102345.6->去掉小數部分102345->102345%10=5取到保留小數位數的下一位數字,判斷舍入 long money = (long)(inputMonney * Math.pow(10, decimalDigit + 1)); if (money % 10 > 4) { money = (money / 10) + 1; } else { money = money / 10; } StringBuffer sbf = new StringBuffer(); while (money != 0) { sbf.insert(0, units[uint++]);//插入人名幣單位 sbf.insert(0, data[(int) (money % 10)]);//插入單位所對應的值 money = money / 10; } //使用replaceAll替換掉「零+'人民幣單位'」,replaceAll裏面的old字符串能夠是正則表達式 return sbf.toString().replaceAll("零[仟佰拾]", "零").replaceAll("零+萬", "萬").replaceAll("零+億", "億").replaceAll("億萬", "億零").replaceAll("零+", "零").replaceAll("零元", "元").replaceAll("零[角分]", ""); } public static void main(String[] args) { System.out.println(convert(25936.36)); } }
4.二叉樹設計模式
package JavaMianSiTest; /** * 說明生活中遇到的二叉樹,用 java 實現二叉樹 。 這是組合設計模式。 我有不少個(假設 10 萬個)數據要保存起來,之後還須要從保存的這些數據中檢索是否存在 某個數據, (我想說出二叉樹的好處, 該怎麼說呢?那就是說別人的缺點) , 假如存在數組中, 那麼,碰巧要找的數字位於 99999那個地方,那查找的速度將很慢,由於要從第 1 個依次往 67 後取,取出來後進行比較。平衡二叉樹(構建平衡二叉樹須要先排序,咱們這裏就不做考慮 了)能夠很好地解決這個問題,但二叉樹的遍歷(前序,中序,後序)效率要比數組低不少, * store(int value)能夠選擇二叉樹中是否能夠存在相同的值 */ //Node,準確的說,是樹(包括子樹)的根節點 public class ErChashuTest{ public int value; public ErChashuTest left; public ErChashuTest right; //這種存儲方式,是:往已經存在的節點的左右子節點上尋找插入點,而不是考慮做爲已經存在的節點的父節點,會形成二叉樹的不平衡 public void store(int value){ if(value<this.value){ if(left==null){ left = new ErChashuTest(); left.value=value; }else{ left.store(value); } }else if(value>this.value){ if(right==null){ right = new ErChashuTest(); right.value=value; }else{ right.store(value); } }//已經存在的值,不插入 } //先序遍歷 public void preList(){ System.out.print(this.value+","); if(left!=null)left.preList(); if(right!=null)right.preList(); } //中序遍歷 public void middleList(){ if(left!=null)left.middleList(); System.out.print(this.value+","); if(right!=null)right.middleList(); } //後序遍歷 public void afterList(){ if(left!=null)left.afterList(); if(right!=null)right.afterList(); System.out.print(this.value+","); } public static void main(String [] args){ int[] data = new int[20]; for(int i=0; i<data.length; i++){ data[i] = (int)(Math.random()*100)+1;//0+1<<x*100+1<<1*100+1 System.out.print(data[i]+","); } System.out.println(); ErChashuTest root = new ErChashuTest(); root.value = data[0]; for(int i=1; i<data.length; i++){ root.store(data[i]); } root.preList(); System.out.println(); root.middleList(); System.out.println(); root.afterList(); } }
5.對文件中的姓名的重複次數進行排序數組
package JavaMianSiTest; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.TreeSet; /* * 從類試以下文本文件中讀取全部的姓名,並打印出重複的姓名和重複的次數 * 並按重複次數排序 * */ public class ChongFuSort { /** * ①讀取文件到字符串 * ②按照換行分割成字符串數組 * ③遍歷字符串數組,取出姓名 * ④將姓名和出現的次數存入map中; * ⑤利用 treeset整理結果;爲此須要封裝User,其中包含了name,以及count;須要在User 中實現comparable接口或者構造 treesetmap時傳入comparator; * * @throws Exception */ static class User /*implements Comparable<User>*/ { String name; int count ; public User(String name, int count) { super(); this.name = name; this.count = count; } @Override public String toString() { return "User [name=" + name + ", count=" + count + "]" ; } /** * 方法一。使用comparable接口來進行排序; */ // @Override // public int compareTo(User o) { // if(this.count>o.count)return -1; // if(this.count<o.count)return 1; // // return this.name.compareTo(o.name); // // return this.count>o.count?1:(this.count<o.count?-1:this.name.compareTo(o.name)); // // } } public static void main(String[] args) throws Exception { //讀取文件; File file= new File("D:/eclipse項目/a.txt" ); FileReader fr=new FileReader(file); int fileSize=(int) file.length(); char[] buff=new char[fileSize]; //用來存放名字和對應的次數; Map<String, Integer> map= new HashMap<String, Integer>(); //安裝次數由小到大排序後的結果;傳入比較器,使用comparator來比較;這樣元素再加入的時候就會調用比較方法,按照默認升序排列 Set<User> sortedResult= new TreeSet<User>(new Comparator<User>() { public int compare(User o1, User o2) { // if(o1.count>o2.count)return -1;//默認是從小到大排列 // if(o1.count<o2.count)return 1; // return o1.name.compareTo(o2.name); //更簡潔的寫法 return o1.count >o2.count ? 1:(o1.count<o2.count ?-1:o1.name .compareTo(o2.name)); } }); int len=fr.read(buff);//獲得讀取的字符個數; String result= new String(buff,0,len); String[] strings = result.split( "\\s+"); //將姓名提取出來;並將姓名和出現的次數放入到集合中; for (String string : strings) { string= new String(string.getBytes(),"gbk" );//1,張三,28(解決亂碼) System. out.println(string); String[] strings2 = string.split( ","); String name=strings2[0]; //存入姓名以及對應的次數 Integer count=map.get(name); if(count==null ){ map.put(name, 1); } else{ map.put(name, count+1); } } //遍歷map,獲得全部的entry集合,封裝成user,加入到set集合中; Set<Map.Entry<String, Integer>> entrySet = map.entrySet(); Iterator<Entry<String, Integer>> iterator = entrySet.iterator(); while(iterator.hasNext()){ Entry<String, Integer> entry = iterator.next(); System. out.println(entry.getKey()+":" +entry.getValue()+"次"); User user= new User(entry.getKey(), entry.getValue()); sortedResult.add(user); //在加入數據時,自動安裝 compareto定義的進行排序; } //遍歷整理好的set,從小到大升序排列 Iterator<User> it = sortedResult.iterator(); while(it.hasNext()){ User user=it.next(); System. out.println(user); } } }
6.遞歸排序app
package org.sbj.sort; import java.util.Arrays; public class SortTest { /* * 快速排序(遞歸排序) * @param strDate * @param left * @param right */ public void quickSort(String []strDate,int left,int right ) { String middle,tempDate; int i,j; i=left; j=right; middle=strDate[(i+j)/2]; do { while (strDate[i].compareTo(middle)<0&&i<right) i++;//找出左邊比中間值大的數 while(strDate[j].compareTo(middle)>0&&j>left) j--;//找出右邊比中間值小的數 if(i<=j) {//將左邊大的數和右邊曉得數進行替黃 tempDate=strDate[i]; strDate[i]=strDate[j]; strDate[j]=tempDate; i++; j--; } }while(i<=j);//當二者交錯時中止 if(i<right) { quickSort(strDate,i,right); } if(j>left) { quickSort(strDate,left,j); } } public static void main(String[] args) { String [] strVoid= {"12","52","36","89","47","12","4","23","68"}; SortTest sort= new SortTest(); sort.quickSort(strVoid, 0, strVoid.length-1); for(int i=0;i<strVoid.length;i++) { System.out.print(strVoid[i]+" "); } } }