一个让我比较郁闷的需求、、
产品经理给了一个需求,让我着实比较郁闷,不过理论上讲世界上是没有没答案的问题的所以只能按照需求给出个相对可以实现的结果。
需求如下:
淘宝店铺的标题展示规则:因为做移动互联网的,手机屏幕毕竟很小,淘宝给的接口中的标题又比较长所以只能是去做相应的截取了
1.过滤特殊符号,以空格代替
2.过滤url编码:将类似 %3F 去除
3.过滤空白,去除标题首尾空白
4.以第一个空格前的词组为标题,如字段长度8个字符(4个汉字)以下(不含8个字符)时,以第二个空格前第一个空格后的词组为标题。
5.当第一个文字词组和第二个文字词组均在8个字符(4个汉字以下)依次类推,以第三,第四个词组作为标题。若所有标题均不能满足需求,则以第一个文字词组为标题。
需求中的字符 其实应该是字节的吧、、、、咳咳
实现代码如下:
1 private String formatTitle() { 2 3 this.subTitle = this.title; 4 for (String a : InitUtils.getInstance().getSpecialList()) {//这个单例是获取那个特殊字符的列表的 5 if (this.subTitle.indexOf(a) > -1) { 6 this.subTitle = this.subTitle.replace(a, " ").replace("amp;", "").trim(); 7 } 8 } 9 String[] array = this.subTitle.split(" "); 10 if (array[0].length() >= 4) { 11 this.subTitle = array[0]; 12 } else { 13 String temp = array[array.length - 1]; 14 for (int i = 0; i < array.length; i++) {//这里的冒泡其实就是找到最长的那个啦 15 for (int j = array.length - 1; j > i; j--) { 16 if (array[j].getBytes().length < array[j - 1].getBytes().length) { 17 temp = array[j - 1]; 18 array[j] = array[j - 1]; 19 array[j - 1] = temp; 20 } 21 } 22 } 23 this.subTitle = temp; 24 } 25 26 if (this.subTitle.length() >= 10) { 27 this.subTitle = this.bstring(this.subTitle, 16) + "..."; 28 } 29 return this.subTitle; 30 } 31 //使用subString 进行截取会按照字符串的长度进行截取,显然会出现只剩几个英文字母的情况,而这也不是产品所想要的,而且他的意思也是 截取的时候要通过字节计算长度,而这就不可避免的出现把汉字截取成一半的情况了所以使用以下的方法对字符串进行截取 32 public String bstring(String s, int length){ 33 try { 34 int i = 2; 35 byte[] bytes = s.getBytes("Unicode"); 36 int n = 0; 37 for(;i<bytes.length&&n<length;i++){ 38 if(i%2==1){//奇数位置 ,是字节中的第二个位置 39 n++; 40 }else{ 41 if(bytes[i]!=0){//这里如果不等于0,就说明当前的字节是属于一个汉字的,需要把截取长度加1哦 42 n++; 43 } 44 } 45 } 46 if(i%2==1){ 47 if(bytes[i-1]!=0){ 48 i-=1; 49 }else{ 50 i+=1; 51 } 52 } 53 return new String(bytes,0,i,"Unicode"); 54 } 55 catch (UnsupportedEncodingException e) { 56 LogUtils.getError().error("cut tabshops title errror", e); 57 } 58 return ""; 59 }
82604119 java 菜鸟群 多多学习 一起进步