关于String常用方法的小练习
- 1.设计一个方法 将字符串反转 ok-->ko
- 2.设计一个方法 将给定字符串的正序和反序进行连接 ok-->okko
- 3.设计一个方法 判断给定字符串是否是回文 abccba abcba
- 4.设计一个方法 将给定的字符串右位移x位置 (helloworld,2) --> ldhellowor
- 5.设计一个方法 寻找若干字符串中最长的那个 ab,abc,abcd--->abcd
- 6.设计一个方法 统计给定字母在字符串中出现的次数 "this is a test of java","a"--->3
- 7.设计一个方法 将给定的字符串每一个首字母大写 "this is a test of java"--->"This Is A Test Of Java"
- 8.设计一个方法 获取给定字符串中的全部数字 "za1o1zbp24tcq"--->1124
- 9.设计一个方法 统计给定子串在字符串中出现的次数 "this is a test of java","this"--->1### 一般思路:
(01号表示我自己设计的,02号表示老师设计的)
1.设计一个方法 将字符串反转 ok–>ko
01
//1.设计一个方法 将字符串反转 ok-->ko
public String reverseStr(String str){
String newStr = "";
for (int i = str.length()-1;i>=0;i--){
//newStr+=str.charAt(i);
newStr = newStr.concat(""+str.charAt(i));
}
return newStr;
}
02
执行效率更高:
public String reverse(String str){
char [] value = str.toCharArray();
for (int i = 0;i<value.length/2;i++){
char temp = value[i];
value[i] = value[value.length-1-i];
value[value.length-1-i] = temp;
}
return new String(value);
}
或者使用StringBuilder中自带的reverse方法:
public String reverse2(String str){
return new String(new StringBuilder(str).reverse());
}
2.设计一个方法 将给定字符串的正序和反序进行连接 ok–>okko
//2.设计一个方法 将给定字符串的正序和反序进行连接 ok-->okko
public String conObverAndRever(String str){
String newStr = this.reverseStr(str);
return str.concat(newStr);
}
3.设计一个方法 判断给定字符串是否是回文 abccba abcba
01
//3.设计一个方法 判断给定字符串是否是回文 abccba abcba
public boolean isPlalindrome(String str){
char[] charStrs = str.toCharArray();
for (int i = 0;i<charStrs.length/2;i++){
if (charStrs[i] != charStrs[charStrs.length-1-i]){
return false;
}
}
return true;
}
02
public boolean isPlalindrome2(String str){
//传递进来的str先反转
//用Str与反转之后的字符串进行比较
//如果完全一致,证明是回文
if (this.reverse(str).equals(str)){
return true;
}
return false;
}
4.设计一个方法 将给定的字符串右位移x位置 (helloworld,2) --> ldhellowor
01
//4.设计一个方法 将给定的字符串右位移x位置 (helloworld,2) --> ldhellowor
public String rightDisplacement(String str,int displacement){
//左位移:String newStr = str.substring(displacement).concat(str.substring(0,displacement));
String newStr = str.substring(str.length()-displacement).concat(str.substring(0,str.length()-displacement));
return newStr;
}
02
自定义异常:
public class InvalidCountException extends RuntimeException {
public InvalidCountException(){}
public InvalidCountException(String msg){
super(msg);
}
}
多了两个判断:
public String moveToRight(String str,int count) {
if (count<0){
//这个方法如果只用来做右位移,如果count为负数
//,后面执行subString截取的时候,必然报异常:StringIndexOutOfBoundsException
//我们不妨自定义一个异常
throw new InvalidCountException("count cannot be negative : "+count);
}
if (count>str.length()){
count %= str.length();
}
//截取
//前半部分
String begin = str.substring(0,str.length()-count);
//后半部分
String end = str.substring(str.length()-count);
//拼接后返回
return end.concat(begin);
}
5.设计一个方法 寻找若干字符串中最长的那个 ab,abc,abcd—>abcd
01
//5.设计一个方法 寻找若干字符串中最长的那个 ab,abc,abcd--->abcd
public String retuMaxStr(String[] strArr){
int maxLen = 0;
String maxStr = "";
for(int i = 0;i<strArr.length;i++){
if(maxLen<strArr[i].length()){
maxLen = strArr[i].length();
}
}
for (String s:strArr){
if (s.length()==maxLen){
maxStr = s;
break;
}
}
return maxStr;
}
02
使用动态参数列表,它的底层还是数组,但它的好处在于,不传参数也行。
代码更优化:
public String findMaxLengthStr(String... strs){
String result = strs[0];
int maxLen = strs[0].length();//第一个字符串的长度
for (int i = 1;i<strs.length;i++){
if (maxLen<strs[i].length()){
maxLen = strs[i].length();
result = strs[i];
}
}
return result;
}
6.设计一个方法 统计给定字母在字符串中出现的次数 “this is a test of java”,“a”—>3
一般思路:
//6.设计一个方法 统计给定字母在字符串中出现的次数 "this is a test of java","a"--->3
public int letterExistCount(String str,char letter){
int count = 0;
for (int i = 0;i<str.length();i++){
if (str.charAt(i)==letter){
count++;
}
}
return count;
}
巧妙思路:
不用循环,直接用replace()方法把字母替换为空串,替换了几次,就证明有几个这样的字母,字符串长度就少几。
public int letterExistCount2(String str,char letter){
return str.length()-str.replace(String.valueOf(letter),"").length();
}
7.设计一个方法 将给定的字符串每一个首字母大写 “this is a test of java”—>“This Is A Test Of Java”
01
//7.设计一个方法 将给定的字符串每一个首字母大写 "this is a test of java"--->"This Is A Test Of Java"
public String title(String str){
String [] sArr = str.split(" ");
String newStr = "";
for (int i = 0;i<sArr.length;i++){
String pre = sArr[i].charAt(0) + "";
String up = pre.toUpperCase();
newStr = newStr.concat(up).concat(sArr[i].substring(1)).concat(" ");
}
return newStr;
}
02
public String firstLetterToUpperCase(String str){
String result = "";//最终拼接完整字符串
//将完整的字符串按照空格拆分成好多单词 split
String[] value = str.split(" ");
//循环处理每一个单词 截取首字母-->大写 截取其余的字母 整体拼接
//每一次的单词拼接成一个完整的字符串 返回 a.append(b)
for(int i=0;i<value.length;i++){
String word = value[i];//获取每一个单词
String firstLetter = word.substring(0,1).toUpperCase();//首字母截取 变大写
String otherLetters = word.substring(1);//其余的其他字母
result = result.concat(firstLetter.concat(otherLetters)+" ");//注意String的不可变特性
}
return result.trim();//去掉最后多余的那个空格
}
8.设计一个方法 获取给定字符串中的全部数字 “za1o1zbp24tcq”—>1124
01
//8.设计一个方法 获取给定字符串中的全部数字 "za1o1zbp24tcq"--->1124
public int getNumInStr(String str){
String numStr = "";
//unicode中数字0-9对应的是48-57
for (int i = 0;i<str.length();i++){
if(48<=str.charAt(i)&& str.charAt(i)<=57){
numStr = numStr.concat(str.charAt(i)+"");
}
}
return Integer.parseInt(numStr);
}
02
public int findNumber(String str){
String result = "";
//循环找寻字符串中的每一个 字符
//判断当前找到的字符是否是 数字 '0'---'9' 48--57
for(int i=0;i<str.length();i++){
int code = str.codePointAt(i);//每一个字符对应的code码
if(code>=48 && code<=57){
result += (char)code;
}
}
//将找到的数字返回
return Integer.parseInt(result);//int value = new Integer(result);
}
9.设计一个方法 统计给定子串在字符串中出现的次数 “this is a test of java”,“this”—>1### 一般思路:
利用replaceAll
/**
*
* @param str 字符串
* @param sub 子串
* @return
*/
public static int subInStrcount(String str,String sub){
return (str.length()-str.replaceAll(sub,"").length())/sub.length();
}
利用indexOf
indexOf只会返回字符串时的下标索引,不会像replaceAll对字符串做替换的操作,个人感觉它的效率更高。
public static int countSubInStr(String str,String sub){
int count = 0;
int indexOf = str.indexOf(sub);
while (indexOf != -1){
count++;
indexOf = str.indexOf(sub,indexOf+sub.length());
}
return count;
}