Java高级编程day19
String常见算法题
1.模拟一个trim方法,去除字符串两端的空格。
@Test
//1.模拟一个trim方法,去除字符串两端的空格。
public void demo1() {
int index = -1;
int end = -1;
String str = " gao you d ao";
System.out.println(str.trim());
char[] chars = str.toCharArray();
if (chars[0] == ' ') {
for (int i = 0; i < chars.length; i++) {
if (chars[i] != ' ') {
index = i;
break;
}
}
}
if (chars[chars.length - 1] == ' ') {
for (int i = chars.length - 1; i > -1; i--) {
if (chars[i] != ' ') {
end = i;
break;
}
}
}
if (index == -1 && end == -1) {
System.out.println(str);
} else if (index == -1) {
System.out.println(str.substring(0, end));
} else if (end == -1) {
System.out.println(str.substring(index));
} else {
System.out.println(str.substring(index, end));
}
}
2.将一个字符串进行反转。将字符串中指定部分进行反转。比如“abcdefg”反转为’abfedcg”
@Test
//将一个字符串进行反转。将字符串中指定部分进行反转。比如“abcdefg”反转为'abfedcg”
public void demo2() {
Scanner sc = new Scanner(System.in);
System.out.println("输入字符序列:");
String str = sc.next();
System.out.println(str);
System.out.println("输入反转的起始序号:");
int start = sc.nextInt();
System.out.println("输入反转的结束序号:");
int end = sc.nextInt();
/* 方式一
char[] chars = str.toCharArray();
for (int i = start,j=end; i<j; i++,j--) {
char temp = chars[i];
chars[i] = chars[j];
chars[j] = temp;
}
System.out.println(chars);
sc.close();*/
//方式二
/* String s1=str.substring(0,start);
String s2=str.substring(end+1);
for (int i = end; i >=start ; i--) {
s1+=str.charAt(i);
}
s1+=s2;
System.out.println(s1);*/
//方式三
StringBuilder s1 = new StringBuilder(str.substring(0, start));
String s2 = str.substring(end + 1);
for (int i = end; i >= start; i--) {
s1.append(str.charAt(i));
}
s1.append(s2);
System.out.println(s1);
}
3.获取一个字符串在另一个字符串中出现的次数。比如:获取“ab”在“abkkcadkabkebfkabkskab”中出现的次数
@Test
//3.获取一个字符串在另一个字符串中出现的次数。比如:获取“ab”在“abkkcadkabkebfkabkskab”中出现的次数
public void demo3() {
int total = 0;
String str = "aaaaaaaaa";
String s="aa";
//String str = "ababababababab";
int index = str.lastIndexOf("aa");
if (index != -1) {
while (true) {
if (index != -1) {
index = str.lastIndexOf("aa", index - s.length());
total++;
} else {
break;
}
}
}
System.out.println(total);
}
4.获取两个字符串中最大相同子串。比如:str1= “abcwerthelloyuiodef”;str2=“cvhellobnm”
提示:将短的那个串进行长度依次递减的子串与较长的串比较。
public void demo4() {
String str1 = "abcwerthelloyuiodef";
String str2 = "cvhellobnm";
String maxStr = (str1.length() >= str2.length()) ? str1 : str2;
String minStr = (str1.length() < str2.length()) ? str1 : str2;
for (int i = 0; i < minStr.length(); i++) {
for (int j = 0,x=minStr.length()-i; x <=minStr.length() ; j++,x++) {
String newString = minStr.substring(j, x);
if (maxStr.contains(newString)) {
System.out.println(newString);
return;
}
}
}
}
SimpleDateFormat
SimpleDateFormat可以使用空参构造器来创建对象,但模板将固定,例如:22-7-26 下午1:18
格式化:format方法会将日期===》字符串类型,变为构造器模板的值
解析:parse方法要与构造器使用的模板一致,格式化逆过程 ,字符串类型===》日期
SimpleDateFormat可以使用有参构造器来自定义模板创建对象 例如:yyyy-MM-dd hh:mm:ss
public void test() throws ParseException {
//SimpleDateFormat可以使用空参构造器来创建对象,但模板将固定,例如:22-7-26 下午1:18
SimpleDateFormat sdf = new SimpleDateFormat();
Date date = new Date();
String format = sdf.format(date);
System.out.println(format);
//parse方法要与构造器使用的模板一致
Date parse = sdf.parse("20-2-81 下午1:18");
System.out.println(parse);
//SimpleDateFormat可以使用自定义的模板构造器来创建对象
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String format1 = sdf1.format(date);
System.out.println(format1);
Date parse1 = sdf1.parse("2000-9-5 22:22:22");
System.out.println(parse1);
System.out.println(sdf.format(parse1));
}
练习:字符"2020-09-08"转换为java.sql.Date
public void test1() throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date time = sdf.parse("2020-09-08");
java.sql.Date date = new java.sql.Date(time.getTime());
System.out.println(date);
}
Calendar
Calendar日历类是抽象类,不能通过new来创建实例,有两种方式
第一种,直接new子类,GregorianCalendar
第二种,通过类名调用静态方法getInstance()
get(对象.静态属性)
set(对象.静态属性,需要设置的值)
add(对象.静态属性,需要设置的值) 将属性做加减运算
setTime()设置日期
getTime()得到日期
注意:
获取月份时:一月是0,二月是1,以此类推,12月是11
获取星期时:周日是1,周二是2,。。。。周六是7
public void test2(){
//Calendar日历类是抽象类,不能通过new来创建实例,有两种方式
//第一种,直接new子类,GregorianCalendar
//第二种,通过类名调用静态方法getInstance()
Calendar calendar = Calendar.getInstance();
//System.out.println(calendar.getClass());
//get(对象.静态属性)
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
//set(对象.静态属性,需要设置的值)
calendar.set(Calendar.DAY_OF_MONTH,5);
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
Date date = new Date();
calendar.setTime(date);
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
System.out.println(calendar.getTime());
calendar.add(Calendar.DAY_OF_MONTH,1);
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
}
JDK8中日期时间API的测试
LocalDate LocalTime LocalDateTime的使用
LocalDateTime使用频率最高
now():获取当前的日期 时间 日期+时间
of():设置为指定的年 月 日 时 分 秒。没有偏移量,设置什么就是什么
getXxx():获取你想要的值
withXxx():设置值,体现不可变性
plusXxx():加,体现不可变性
minusXxx():减
Instant(瞬时)
类似于java.util.Date类
now():获取本初子午线对应的标准时间
atOffset():添加时间的偏移量
toEpochMilli():获取自1979年1月1日8时9分9秒(UTC)开始的毫秒数
ofEpochMilli():通过给定的毫秒数,获取Instant实例----->Date(long millis)
DateTimeFormatter
自定义的格式如 ofPattern(“yyyy-MM-dd hh:mm:ss”)
自定义类实现Comparable:自然排序
Comparable接口的使用举例:自然排序
1.string、包装类等实现了ComparabLe接口,重写了compareTo(obj)方法,给出了比较两个对亲
2.istring、包装类重写compareTo()方法以后,进行了从小到大的排列
3.里写compareTo(obj)的规则:
如果当前对象this大于形参对象obj,则返回正整数,
如果当前对象this小于形参对象obj,则返回负整数,
如果当前对象this等于形参对象obj,则返回零。
4.对于自定义类来说,如果需要排序,我们可以让自定义类实现ComparabLe接口,重写compareTo()方法,在compareTo(obj)方法中指明如何排序
如果是自定义类数组,当实现Comparable接口,重写了CompareTo方法,就可以使用Arrays.sort()进行排序
Comparator接口的使用:定制排序
1.背景:
当元素的类型没有实现java.lang.ComparabLe:接口而又不方便修改代码,
或者实现了java.lang.ComparabLe.接口的排序规则不适合当前的操作,
那么可以考虑使用Comparator的对象来排序
2.重写compare(Object o1,0 oject o2)方法,此较o1和o2的大小:
如果方法返回正整数,则表示o1大于o2:
如果返回0,表示相等:
返回负整数,表示o1小于o2。
System类
百度
Math类
BigInteger和BigDecimal
BigInteger:整型,很大
BigDecimal:浮点型,精度比较高