package cn.itcast.p1.string.demo;
/*
* 对字符串数组中的字符串进行排序
* String [] arr = {"abc","aba","abb","zzz","xxx","hhh"};
*
* 思路:1,用做比较,对数组进行遍历打印
* 2,对字符串数组排序,排序可以使用冒泡排序法。
* 难点:字符串是对象,应该用对象的比较方法 compareTo()
*
*/
public class StringTest {
public static void main(String[] args) {
String [] arr = {"abc","aba","abb","zzz","xxx","hhh"};
printArray(arr);
sortArray(arr);
printArray(arr);
}
//冒泡排序法
public static void sortArray(String[] arr) {
for (int i = 0; i < arr.length-1; i++) {
for (int j = i+1; j < arr.length; j++) {
if(arr[i].compareTo(arr[j]) > 0)
swap(arr,i,j); //传进去一个数组,交换
}
}
}
private static void swap(String[] arr, int i, int j) {
String temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void printArray(String[] arr) {
System.out.print("["); //为了输出好看
for (int i = 0; i < arr.length; i++) {
if(!(i==arr.length-1))
System.out.print(arr[i]+",");
else
System.out.println(arr[i]+"]");
}
}
}
package cn.itcast.p1.string.demo;
/*
* 获取一串字符中的子串出现的次数
* "nbaasdnbaiinbaohnnbapwnba"
* 用indexOf找到对应的字符串角标,找到后就计数
*
*/
public class stringTest_1 {
public static void main(String[] args) {
//不用多说,先搞个字符串对象
String str = "nbaasdnbaiinbaohnnbapwnba";
//需要寻找的子串
String key = "nba";
//定义一个计数变量
int count = getKeyStringCount(str,key);
System.out.println("count = "+count);
}
public static int getKeyStringCount(String str, String key) {
int index = 0;
int count = 0;
while((index = str.indexOf(key,index))!= -1)
{
index = index +key.length();
count++;
}
return count;
}
/**
* 获取子串在整串中出现的次数。
* @param str
* @param key
* @return
*/
public static int getKeyStringCount_1(String str, String key) {
//1,定义计数器。
int count = 0;
//2,定义变量记录key出现的位置。
int index = 0;
while((index = str.indexOf(key))!=-1){
str = str.substring(index+key.length());
count++;
}
return count;
}
}
package cn.itcast.p1.string.demo;
/*
* 获取最大包含子串(两个字符串中最大相同子串)
* jhfiwkdhahjasfkj
* sshahjasff
* 思路:
* 直接考虑怎么比较,如果子串一开始就包含在大的字符串中,就直接返回即可,如果没有,就递减,子串递减的时候要考虑两边,
* 如:
* sshahjasff
* 0 9
* 第一次递减:sshahjasf shahjasff
* 0 8 1 9
* 第二次递减:sshahjas shahjasf hahjasff
* 0 7 1 8 2 9
* 第三次递减:sshahja shahjas hahjasf ahjasff
* 0 6 1 7 2 8 3 9
* 以此类推,就考虑每次减少一个字符后会产生多少不同的子串,直到能和长串对比出包含的最大子串就可以返回了。
* 从递减下来的图看,类似一个三角形,只要是三角形,就能考虑到for循环嵌套。
* (for循环条件)
* sshahjasff
* 1 10
*
*/
public class stringTest_2 {
public static void main(String[] args) {
String s1 = "zxcbasdfabacazcvasdxcv";
String s2 = "asdfabacasdba";
String s = getMaxString(s1,s2);
System.out.println(" 最大相同子串 = "+s);
}
public static String getMaxString(String s1, String s2) {
//好的方法能区别出输入的字符串哪个大哪个小
String max = null,min = null;//定义区别长串和子串的容器
max = (s1.length() > s2.length())?s1:s2;
min = max.equals(s1)?s2:s1;
System.out.println("max = "+max);
System.out.println("min = "+min);
//开始判断子串是否包含长串中
for (int i = 0; i < min.length(); i++) {
//根据递减效果图,需要两个变量当角标
for (int j = 0, k = min.length() - i; k!=min.length()+1 ; j++,k++) {
String sub = min.substring(j,k);//画出规律,看着规律就容易找到循环的条件和方法
if(max.contains(sub))
return sub;
}
}
return null;
}
}
/*
* 运行结果:
* max = zxcbasdfabacazcvasdxcv
min = asdfabacasdba
最大相同子串 = asdfabaca
*/
package cn.itcast.p1.string.demo;
/*
* 模拟trim方法
* 思路:
* 给一个字符串,检测空格,从头和尾检测,检测到就去除,去除方法:锁定角标(charAt()通过角标找字符串方法)
* 考虑到空格情况,所以有:头<=尾.length();
*
*/
public class stringTest_3 {
public static void main(String[] args) {
String s = " ab c ";
s = Mytrim(s);
System.out.println("-"+s+"-");
}
public static String Mytrim(String s) {
int start = 0,end = s.length() - 1;//s.length()-1 为什么呀?答字符串角标越界嘛
while(start <= end && s.charAt(start) == ' ')//这里给写错了,'' 字符 , "" 字符串呀!
{
start++;
}
while(end <= end && s.charAt(end) == ' ')
{
end--;
}
return s.substring(start,end +1); // end+1 为什么呀?答:因为包含头,不包含尾嘛
}
}
练习题学会自己思考和分析问题非常重要,因为这么简单的练习都不去好好考虑,那也别学JAVA了!