有一个字符串hello4422world23haha2bingbing54xiaokun33hello82788hello333333world67890xiaokun8838383838hello88877haha
要求:
1.将所有的单词找出,并确定每个单词的个数
2.将单词和单词个数放入对象MyWord,将所有的MyWord对象存入数组.
3.分别按照单词个数和单词从小到大排序(使用匿名内部类和lambda表达式)
分析使用的知识点:
字符串
正则表达式
( 正则表达式:通过设定规则,用来对字符串进行规则下的操作(切割,替换,取字串,匹配)
+ 一个或多个
\d 表示数字
\d+ 表示一个或多个数字)
接口
匿名内部类
lambda表达式
常用类
代码实现:
package com.cr.instance;
import java.util.Arrays;
/*
有一个字符串hello4422world23haha2bingbing54xiaokun33hello82788hello333333world67890xiaokun8838383838hello88877haha
要求:
1.将所有的单词找出,并确定每个单词的个数
2.将单词和单词个数放入对象MyWord,将所有的MyWord对象存入数组.
3.分别按照单词个数和单词从小到大排序(使用匿名内部类和lambda表达式)
使用的知识点:
字符串
正则表达式
接口
匿名内部类
lambda表达式
常用类
*/
public class Instance02 {
//1.将所有的单词找出,并确定每个单词的个数
public static void main(String[] args) {
MyWord[] myWords = getWords();
//创建比较器对象
//使用匿名子类对象
//根据单词的个数比较
MyComparator myComparator = new MyComparator() {
@Override
public int compara(MyWord m1, MyWord m2) {
return m1.number-m2.number;
}
};
queue(myWords,myComparator);
System.out.println(Arrays.toString(myWords));
//根据单词的长短比较
queue(myWords, new MyComparator() {
@Override
public int compara(MyWord m1, MyWord m2) {
return m1.word.length()-m2.word.length();
}
});
System.out.println(Arrays.toString(myWords));
//使用lambda表达式
queue(myWords,((m1, m2) -> m1.number-m2.number));
}
//2.将单词和单词个数放入对象MyWord,将所有的MyWord对象存入数组.
public static MyWord[] getWords(){
String string = "hello4422world23haha2bingbing54xiaokun33hello82788hello333333world67890xiaokun8838383838hello88877haha";
//切割
//选刀
/*
正则表达式:通过设定规则,用来对字符串进行规则下的操作(切割,替换,取字串,匹配)
现在要作为刀的是 4422 23 2 54 等
+ 一个或多个
\d 表示数字
\d+ 表示一个或多个数字
*/
String[] words = string.split("\\d+");
System.out.println(Arrays.toString(words));
//先排序-默认排序,字典排序
Arrays.sort(words);
System.out.println(Arrays.toString(words));
//设定临时变量,存储临时字符串----工作字符串
String temp = words[0];
//临时的单词隔宿计数器
int num = 0;
//创建数组,存放MyWords对象
MyWord[] myWords = new MyWord[words.length];
//设定计数器,表示数组的下标
int newNum = 0;
int i = 0;
for (;i < words.length;i++){
if (temp.equals(words[i])){
num++;
}else{
//遍历结束的单词以及个数存入Myword对象
MyWord myWord = new MyWord(temp,num);
//将MyWord对象放入数组
myWords[newNum] = myWord;
newNum++;
//temp需要指向下一个元素
temp = words[i];
//num需要重置成0
num = 0;
//保证每一个分组中的第一个单词也记录到num中
i--;
}
//手动将最后一组数放入数组
if (words.length-1 == i){
MyWord myWord = new MyWord(temp,num);
myWords[newNum] = myWord;
}
}
return Arrays.copyOf(myWords,newNum+1);
}
static class MyWord{
private String word;
private int number;
public MyWord(){}
public MyWord(String word, int number) {
this.word = word;
this.number = number;
}
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
@Override
public String toString() {
return "MyWord{" +
"word='" + word + '\'' +
", number=" + number +
'}';
}
}
//3.分别按照单词个数和单词从小到大排序(使用匿名内部类和lambda表达式)
public static void queue(MyWord[] myWords,MyComparator comparator){
for (int i=0;i<myWords.length-1;i++) {
for (int j=1;j<myWords.length-1-i;j++){
if (comparator.compara(myWords[j],myWords[j+1])>0){
MyWord myWord = myWords[j];
myWords[j]= myWords[j+1];
myWords[j+1] = myWord;
}
}
}
}
interface MyComparator{
int compara(MyWord m1,MyWord m2);
}
}