生活随笔
收集整理的這篇文章主要介紹了
java字符串排序
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
java字符串排序
今天收到一個(gè)公司的面試邀請(qǐng),人還沒去,直接面試題都發(fā)過來了,真仗義啊。哈哈哈,我看了一下面試題,難度還是挺高的,怪不得直接給我。
我大致看了一下關(guān)于java方面的面試題,我還是對(duì)其中一個(gè)編程題挺感興趣的,題目如下:
就是對(duì)一個(gè)無序字符串進(jìn)行排序,主要難度在怎么處理字母的排序,Arrays類和Collections類提供的排序方法都是大寫字母在前的,題目要求的是小寫在前。這就是個(gè)考點(diǎn),廢話不多說直接上代碼:
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;/*** * @author 謝輝 2019.8.9**/
public class StrSplit {public static void main(String[] args) {System.out.println(sortStr("3Ba1cA"));}/*** 思路:* 1、先對(duì)字符串拆分,進(jìn)行第一次排序,目的是把數(shù)字提取出來* 2、數(shù)字提取出來后利用集合工具類得到排序后的字母(缺點(diǎn)是大寫的字母在前,不是想要的結(jié)果) * 3、利用冒泡排序改變大小寫* * @param str* @return*/public static String sortStr(String str) {// 形參拆分char[] charArray = str.toCharArray();// 存取結(jié)果StringBuilder result = new StringBuilder();// 對(duì)數(shù)組排序:數(shù)字、大寫字母、小寫字母Arrays.sort(charArray);int index = 0;// 查找最后一位數(shù)字緊挨著的大寫字母下標(biāo)(將會(huì)使用該下標(biāo)截取字符串)// 0的ASCII碼是48 9的ASCII碼是57for (int i = 0; i < charArray.length; i++) {if (Integer.valueOf(charArray[i]) > 57) {index = i;break;}}// 先截取出所有數(shù)字String temp = String.valueOf(charArray);result.append(temp.substring(0, index));// 剩下純字母字符串String newStr = temp.substring(index);// 利用集合對(duì)字母數(shù)組排序List<String> list = new LinkedList<>();char[] array = newStr.toCharArray();for (char c : array) {list.add(String.valueOf(c));}Collections.sort(list, String.CASE_INSENSITIVE_ORDER);System.out.println(list.toString());// [A, a, B, b, c, d, Z, z]// 排序后的字母都是大寫的在前面String[] strTemp = new String[list.size()];for (int i = 0; i < strTemp.length; i++) {strTemp[i] = list.get(i);}// 利用冒泡排序進(jìn)行對(duì)比,改變大小寫for (int i = 0; i < strTemp.length - 1; i++) {for (int j = 0; j < strTemp.length - 1 - i; j++) {if (strTemp[j].equals(strTemp[j + 1])) {continue;} else if (strTemp[j].equalsIgnoreCase(strTemp[j + 1])) {strTemp[j] = strTemp[j].toLowerCase();strTemp[j + 1] = strTemp[j + 1].toUpperCase();}}}// 拼接字符串for (int i = 0; i < strTemp.length; i++) {result.append(strTemp[i]);}return result.toString();}
}
這個(gè)題就算答完了,嗯?答完了?作為程序員要舉一反三啊,假如面試官要求:d8A68acD 排序此字符串為688acdAD怎么辦?
有辦法繼續(xù)上代碼:
import java.util.Arrays;public class A {public static void main(String[] args) {System.out.println(sortStr("36z1ZaBbdc8","aA0"));}/*** * @param str 需要排序的字符串* @param splitRule 定義的規(guī)則:默認(rèn)是0Aa* @return 排序后的字符串* 規(guī)則介紹:* 對(duì)于排序規(guī)則定義了一個(gè)0、A、a三個(gè)字符組成的字符串規(guī)則,* 0aA表示數(shù)字所有排序后的數(shù)字在前面,所有排序后的小寫字母在中間,所有大寫字母在最后* 規(guī)則有:0Aa(默認(rèn))、A0a、0aA、a0A、aA0*/public static String sortStr(String str, String splitRule) {/*** 思路: * 1、把字符串拆開,用Arrays工具類進(jìn)行排序,排序規(guī)則是:數(shù)字-大寫字母-小寫字母 * 2、根據(jù)規(guī)則按照ASCII碼再次拆分字符串* 3、第一次拆分是把數(shù)字部分拆出來 * 4、第二次把所有大寫字母拆分出來 * 5、第三次把所有小寫字母拆分出來 * 6、按要求再次拼接*/// 0的ASCII碼是48 9的ASCII碼是57// A的ASCII碼是65 Z的ASCII碼是90// a的ASCII碼是97 z的ASCII碼是122// 形參拆分char[] charArray = str.toCharArray();// 存取結(jié)果StringBuilder result = new StringBuilder();// 對(duì)數(shù)組排序:數(shù)字、大寫字母、小寫字母Arrays.sort(charArray);if (null == splitRule || "".equals(splitRule)) {return String.valueOf(charArray);}/** 開始第一次截取*/int index = 0;// 查找最后一位數(shù)字緊挨著的大寫字母下標(biāo)(將會(huì)使用該下標(biāo)截取字符串)for (int i = 0; i < charArray.length; i++) {if (Integer.valueOf(charArray[i]) > 57) {index = i;break;}}// 第一次截取:所有數(shù)字String temp = String.valueOf(charArray);// result.append(temp.substring(0, index));/** 開始第二次截取*/// 該字符串就是去掉數(shù)字的字符串了String newStr = temp.substring(index);int index2 = 0;char[] newCharArr = newStr.toCharArray();// 找到最后一個(gè)大寫字母緊挨著的小寫字母下標(biāo)(使用該下標(biāo)截取字符串)for (int i = 0; i < newCharArr.length; i++) {if (Integer.valueOf(newCharArr[i]) > 90) {index2 = i;break;}}// 截取到的就是所有小寫字母// result.append(newStr.substring(index2));/** 開始第三次截取*/// 截取到的就是所有大寫字母// result.append(newStr.substring(0, index2));String finalResult = "";// 為了程序的擴(kuò)展性,對(duì)一下排序規(guī)則做了定義,就是按照規(guī)則追加字符串if ("0aA".equals(splitRule)) {result.append(temp.substring(0, index));result.append(newStr.substring(index2));result.append(newStr.substring(0, index2));finalResult = result.toString();} else if ("A0a".equals(splitRule)) {result.append(newStr.substring(0, index2));result.append(temp.substring(0, index));result.append(newStr.substring(index2));finalResult = result.toString();} else if ("aA0".equals(splitRule)) {result.append(newStr.substring(index2));result.append(newStr.substring(0, index2));result.append(temp.substring(0, index));finalResult = result.toString();}else if ("a0A".equals(splitRule)) {result.append(newStr.substring(index2));result.append(temp.substring(0, index));result.append(newStr.substring(0, index2));finalResult = result.toString();}return finalResult;}
}
總之面試官的要求千變?nèi)f化,解決問題先有思路,然后問題迎刃而解…
在這里只是分享面試題,希望技術(shù)大牛勿噴,謝謝大牛的照顧。同時(shí)希望小伙伴們指出錯(cuò)誤和不足之處,謝謝大家!
總結(jié)
以上是生活随笔為你收集整理的java字符串排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。