【紧急求助】Java软件工程师面试题! 有一个String s="SDsBEaA"要求产生这样的结果:s="AaBDESs",请高手帮忙! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 试着写了一个public class Test {public static void main(String args[]){ String s="SDsBEaA"; char[] c= s.toCharArray(); for(int j =0;j<c.length;j++){ for(int i = 0;i<c.length-1;i++){ char temp1=Character.toUpperCase(c[i]); char temp2=Character.toUpperCase(c[i+1]); if(temp1==temp2){ temp1=c[i]; temp2=c[i+1]; } if(temp1>temp2){ char temp = c[i]; c[i]=c[i+1]; c[i+1]=temp; } } } s = new String(c); System.out.println(s); }} 不对吧 按ASCII码来讲:A<B<C<D....<a<b<c<d....但结果是:AaBDESs 明显A和B中间有个a,不能纯按Ascii比较 给小写的字符减去31.5再用ascii比较,排序就ok public class Test{ public static void main(String args[]){ String s="SDsBEaA"; Test test=new Test(); s=test.sort(s); System.out.println(s); } public String sort(String param){ char c[]=param.toCharArray(); char min; String s1; String s2; for(int i=0;i<c.length;i++){ min=c[i]; s1=min+""; for(int j=i+1;j<c.length;j++){ s2=c[j]+""; if(s1.compareToIgnoreCase(s2)>0 || (s1.compareToIgnoreCase(s2)==0 && s1.compareTo(s2)>0)){ min=c[j]; c[j]=c[i]; c[i]=min; s1=min+""; } } } return new String(c); }} String s="SDsBEaA" ;StringBuffer sb=new StringBuffer(s); System.out.println("The reversed string is: "+sb.reverse()); //这就是你想要的结果 import java.util.*;import java.util.List;public class sortBy{ public static void main(String str[]) { String s="zSDsBEaA"; List listLow = new ArrayList(); List newList = new ArrayList(); for(int index = 0;index<s.length();index++) { char ch = s.charAt(index); int as = (int)ch; String str44 = String.valueOf(ch); if(as>90) { listLow.add(str44); } newList.add(str44.toUpperCase()); } Collections.sort(listLow); Collections.sort(newList); StringBuffer strB = new StringBuffer(); for(int index =0;index<newList.size();index++) { strB.append(newList.get(index).toString()); } for(int index =0;index<listLow.size();index++) { String strLow = listLow.get(index).toString(); String strUp = strLow.toUpperCase(); if(strB.indexOf(strUp) != strB.lastIndexOf(strUp)){ strB.replace(strB.lastIndexOf(strUp),strB.lastIndexOf(strUp)+1,strLow); }else{ strB.replace(strB.indexOf(strUp),strB.lastIndexOf(strUp)+1,strLow); } } String returnStr = strB.toString(); System.out.println("returnStr>>>>>>>>>>>>"+returnStr); }}費了九牛二虎之力才弄出來,哎 ,真是一天不寫代碼手九生, 按照7楼的写法,写了一个public class Test { public static void main(String[] args) { String str = "SDsBEaA"; System.out.println(sort(str)); } public static String sort(String str) { char[] chars = str.toCharArray(); float[] fs = new float[chars.length]; for (int i = 0; i < fs.length; i++) { if (chars[i] >= 'a' && chars[i] <= 'z') { fs[i] = chars[i] - 31.5f; } else { fs[i] = chars[i]; } } Arrays.sort(fs); for (int i = 0; i < fs.length; i++) { if (fs[i] % 1 != 0) { chars[i] = (char) (fs[i] + 31.5); } else { chars[i] = (char) fs[i]; } } return new String(chars); }} 套用8楼的public class testSort { public String sort(String param){ char c[]=param.toCharArray(); String s1; String s2; for(int i=0;i < c.length;i++){ s1 =String.valueOf(c[0]); for(int j=1;j<c.length;j++){ s2 = String.valueOf(c[j]); if(s1.compareToIgnoreCase(s2)>0 || (s1.compareToIgnoreCase(s2)==0 && s1.compareTo(s2)>0)){ s1 = String.valueOf(c[j]); c[j] = c[j-1]; c[j-1] = s1.charAt(0); } } } return new String(c); } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String s="SDsBEaA"; testSort test=new testSort(); s=test.sort(s); System.out.println(s); }} ustbsjl 等 级: 发表于:2007-11-23 09:50:537楼 得分:0 给小写的字符减去31.5再用ascii比较,排序就ok =======================================顶!好方法 12楼的有问题:s1 =String.valueOf(c[0]);c[0] 应该为c[i]并且该语句应该放入第二个for循环内部 本帖最后由 daisy8675 于 2011-06-03 10:20:29 编辑 import java.util.Arrays;import java.util.regex.Matcher;import java.util.regex.Pattern;public class StringTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String str = "aBAaACEbcfgeediFHH"; //转换为小写,供正则匹配替换,大写也行 String tmp = str.toLowerCase(); char[] chs = tmp.toCharArray(); //必须排序,否则正则无法替换,也可能是我不知道怎么写,哪位朋友写写 Arrays.sort(chs); tmp = String.valueOf(chs); //替换所有重复的字符,替换后的结果为:abcdefghi String sigle = tmp.replaceAll("(.).*\\1","$1"); char[] t = sigle.toCharArray(); String tmpRes = ""; for (int i = 0; i < t.length; i++){ int upCount = getStrRepeat(str,t[i],true); int lowCount = getStrRepeat(str,t[i],false); String rsUP = getString(String.valueOf(t[i]).toUpperCase(),upCount); String rsLow = getString(String.valueOf(t[i]),lowCount); tmpRes += (rsUP + rsLow);//大写在前小写在后 } System.out.println(tmpRes); //输出:AAaaBbCcdEeeFfgHHi } //获取大小写字母出现的次数 //true:大写;false:小写 public static int getStrRepeat(String base,char s,boolean flag){ Pattern p = null; p = flag?Pattern.compile(String.valueOf(s).toUpperCase()):Pattern.compile(String.valueOf(s)); Matcher m = p.matcher(base); int i = 0; while(m.find()){ i++; } return i; } //根据字母重复次数构造字符串 public static String getString(String s,int count){ if (count == 1) return s; else if (count == 0) return ""; else return s + getString(s,count - 1); }}楼主给分吧 9楼的方法不对,得出的结果是:The reversed string is: AaEBsDS并不是所要的结果。 package cn;public class Test { /** * @param args */ public static void main(String[] args) { String s="SDsBEaA" ; char[] c=s.toCharArray(); for(int i=0;i<c.length;i++) { int k=i; char temp; char min='z'; for(int j=i;j<c.length;j++){ char temp1=Character.toUpperCase(c[j]); if(temp1<min) { min=temp1; k=j; } } if(k!=i){ temp=c[i]; c[i]=c[k]; c[k]=temp; } } for(int i=0;i<c.length-1;i++) { char temp; if(c[i]>c[i+1]&&Character.toUpperCase(c[i])==Character.toUpperCase(c[i+1])) { temp=c[i]; c[i]=c[i+1]; c[i+1]=temp; } } s=new String(c); System.out.println(s); }} 给小写的字符减去31.5再用ascii比较,排序就ok看了半天就这个好! public class CharacterSort { public String stringSort(String str) { char[] stringChar = str.toCharArray(); double[] stringDouble = new double[str.length()]; int i = 0; int j = 0; double tempDouble = 0.0d; int paramLength = str.length(); // 下面对小写字母减去31.5 for (i = 0; i < paramLength; i++) { if ((int) stringChar[i] > 96 && (int) stringChar[i] < 123) { stringDouble[i] = (double) stringChar[i] - 31.5; } else { stringDouble[i] = (double) stringChar[i]; } } // 下面进行排序 升序 for (i = 0; i < paramLength - 1; i++) { for (j = 0; j < paramLength - i - 1; j++) { if (stringDouble[j] > stringDouble[j + 1]) { tempDouble = stringDouble[j]; stringDouble[j] = stringDouble[j + 1]; stringDouble[j + 1] = tempDouble; } } } // 还原小写字母 for (i = 0; i < paramLength; i++) { tempDouble = stringDouble[i] * 10 % 10; if (tempDouble > 0.0000001) {// 有小数 stringDouble[i] = (double) (stringDouble[i] + 31.5); } stringChar[i] = (char) stringDouble[i]; } return new String(stringChar); } public static void main(String[] args) { // String stringExample = // "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; String stringExample = new String("SDsBEaA"); CharacterSort characterSort = new CharacterSort(); System.out.println(stringExample); System.out.println(characterSort.stringSort(stringExample)); }} 其中的if(temp1==temp2){temp1=c[i];temp2=c[i+1];}是什么意思呢, 我看了半天也不知道什么意思? package tesstte;public class AscIIsort { public static void main(String args[]) { String s = "SDsBEaA"; char[] c = s.toCharArray(); for (int j = 0; j < c.length; j++) { for (int i = 0; i < c.length-j - 1; i++) { char temp1 = Character.toUpperCase(c[i]); char temp2 = Character.toUpperCase(c[i + 1]); if (temp1==temp2) { temp1 = c[i]; temp2 = c[i + 1]; } if (temp1 > temp2) { char temp = c[i]; c[i] = c[i + 1]; c[i + 1] = temp; } } } s = new String(c); System.out.println(s); }} 先判断大小写,再按ASC码进行比较 先不区分大小写进行比较,然后,asc码比较.不过还是比较麻烦,因为,排序的时候按照大写asc码排序,如果有和它不区分大小写值相等的字符,再次按照asc码比较,这样可以使得有很多字符的时候,比较规整的,每个字母先排列大写,然后小写.接下来排下一个字母. 感觉像是ascii码排序一样...... 怎么我copy 以上能人编写的程序代码编绎运行都报错啊!!! 用集合很好解决啊,面试应该是考你自己定义比较规则的import java.util.*;public class TestSort{ public static void main(String args[]){ String str = "SDsBEAa"; char[] chs = str.toCharArray(); ArrayList<Character> al = new ArrayList<Character>(); for(char c:chs) al.add(c); Collections.sort(al,new Comparator<Character>(){ public int compare(Character ch1,Character ch2){ char c1 = Character.toUpperCase(ch1); char c2 = Character.toUpperCase(ch2); return c1-c2; } } ); System.out.println(al); } import java.util.*;public class TestSort{ public static void main(String args[]){ String str = "SDsBEAa"; char[] chs = str.toCharArray(); ArrayList<Character> al = new ArrayList<Character>(); for(char c:chs) al.add(c); Collections.sort(al,new Comparator<Character>(){ public int compare(Character ch1,Character ch2){ char c1 = Character.toUpperCase(ch1); char c2 = Character.toUpperCase(ch2); return c1-c2; } } ); System.out.println(al); } 很巧妙的方法!!!同理,可以进一步巧妙的去掉小数,A-Z 用0开始的偶数来表示,a-z 用1开始的奇数来表示。import java.util.Arrays;public class Main { public static void main(String[] args) { String s = "SDsBEaA"; char[] carr = s.toCharArray(); for (int i = 0; i < carr.length; i++) { if (carr[i] >= 'A' && carr[i] <= 'Z') { carr[i] = (char) ((carr[i] - 'A') * 2); } else { carr[i] = (char) ((carr[i] - 'a') * 2 + 1); } } Arrays.sort(carr); for (int i = 0; i < carr.length; i++) { if (carr[i] % 2 == 0) { carr[i] = (char) (carr[i] / 2 + 'A'); } else { carr[i] = (char) (carr[i] / 2 + 'a'); } } for (char t : carr) { System.out.print(t); } }} 我那比较器里算法 有点问题,假如小写字母写在前面的话排出来还是在前面,所以要加上一条判断语句,以下是完善的方法import java.util.*;public class TestSort{ public static void main(String args[]){ String str = "SDsBEAa"; char[] chs = str.toCharArray(); ArrayList<Character> al = new ArrayList<Character>(); for(char c:chs) al.add(c); Collections.sort(al,new Comparator<Character>(){ public int compare(Character ch1,Character ch2){ char c1 = Character.toUpperCase(ch1); char c2 = Character.toUpperCase(ch2); if(c1==c2&&ch1>ch2) return 1; return c1-c2; } } ); System.out.println(al); }} 学了几种办法,ascii码减去31.5是什么意思,为什么减31.5. 哇,这个居然是偶们的作业题目。 一大堆的字符、数字比较操作,整那些花里胡哨的干嘛,看的偶晕乎乎的。实现Comparator接口的45楼,简单易懂才是美,呵呵!支持之!Collections.sort(List<T> list, Comparator<? super T> c) 学习了下,同时按偶的思路也写个算法,基本也都能看会。思路:1.先将字母顺序排好,就是按照AaBbCc...Zz排好。 2.将接收的元素依次对应排好的顺序,有则打印。由于1的前提可以保证顺序一定正确。代码如下:import java.util.Scanner;class Paixu{ void sort(char[] c){ char[] c1 = new char[100]; int i=0,j=0; for(i=0;i<27;i++) //先定义位置排好数组c1 (各字母大小写依次) { c1[2*i] = (char)('A'+j); c1[2*i+1]= (char)('a'+j); j++; } for(i=0;i<53;i++) //将接收的数组元素位置匹配到排好的数组里并打印 for(j=0;j<c.length;j++) if(c1[i]==c[j]) System.out.println(c1[i]); } }public class Asc { public static void main(String[] args){ Scanner sca = new Scanner(System.in); String str = sca.next(); new Paixu().sort(str.toCharArray()); }} 大写字母和小写字母哪个ascii大呢 public class SortTester { public static void main(String[] args) { String sequence = "SDsBEaA"; List<String> list = new LinkedList<String>(); for(char s : sequence.toCharArray()) { list.add(String.valueOf(s)); } Collections.sort(list, new Comparator<String>() { public int compare(String o1, String o2) { double i1 = (double) o1.toCharArray()[0]; double i2 = (double) o2.toCharArray()[0]; if (i1 < 91) { i1 += 31.5f; } if (i2 < 91) { i2 += 31.5f; } if (i1 > i2) { return 1; } else if (i1 == i2) { return 0; } else { return -1; } } }); System.out.println(list.toString()); }} 新手求助数据类型存储的问题 Java 线程 同步代码块内代码没执行(无死锁)(附源码) JCreator Pro英文版不支持中文注释吗? 请J2ee/j2se高人指点 一个好的地址!!不容错过啊! 严重问题:http协议上传文件,使用了jspSmartUpload这个包不行,可能是网速限制了,急求解决办法! 如何判断String型数组中是否包含某一个值 怎样设置Label和TextField的字体大小和颜色啊?????? 请教如何通过LDAP协议访问AD?如果有现成的程序最好。 java 有什么方法让指定的任务在每天指定的时间段内反复执行吗? 关于文件传输限速的问题 几个 Java,C ,SQL 的题目,像大家请教
public class Test {
public static void main(String args[]){
String s="SDsBEaA";
char[] c= s.toCharArray();
for(int j =0;j<c.length;j++){
for(int i = 0;i<c.length-1;i++){
char temp1=Character.toUpperCase(c[i]);
char temp2=Character.toUpperCase(c[i+1]);
if(temp1==temp2){
temp1=c[i];
temp2=c[i+1];
}
if(temp1>temp2){
char temp = c[i];
c[i]=c[i+1];
c[i+1]=temp;
}
}
}
s = new String(c);
System.out.println(s);
}
}
按ASCII码来讲:
A<B<C<D....<a<b<c<d....
但结果是:
AaBDESs 明显A和B中间有个a,不能纯按Ascii比较
public class Test{
public static void main(String args[]){
String s="SDsBEaA";
Test test=new Test();
s=test.sort(s);
System.out.println(s);
}
public String sort(String param){
char c[]=param.toCharArray();
char min;
String s1;
String s2;
for(int i=0;i<c.length;i++){
min=c[i];
s1=min+"";
for(int j=i+1;j<c.length;j++){
s2=c[j]+"";
if(s1.compareToIgnoreCase(s2)>0 || (s1.compareToIgnoreCase(s2)==0 && s1.compareTo(s2)>0)){
min=c[j];
c[j]=c[i];
c[i]=min;
s1=min+"";
}
}
}
return new String(c);
}
}
String s="SDsBEaA" ;
StringBuffer sb=new StringBuffer(s);
System.out.println("The reversed string is: "+sb.reverse()); //这就是你想要的结果
import java.util.List;
public class sortBy
{
public static void main(String str[])
{
String s="zSDsBEaA";
List listLow = new ArrayList();
List newList = new ArrayList();
for(int index = 0;index<s.length();index++)
{
char ch = s.charAt(index);
int as = (int)ch;
String str44 = String.valueOf(ch);
if(as>90)
{
listLow.add(str44);
}
newList.add(str44.toUpperCase());
}
Collections.sort(listLow);
Collections.sort(newList);
StringBuffer strB = new StringBuffer();
for(int index =0;index<newList.size();index++)
{
strB.append(newList.get(index).toString());
}
for(int index =0;index<listLow.size();index++)
{
String strLow = listLow.get(index).toString();
String strUp = strLow.toUpperCase();
if(strB.indexOf(strUp) != strB.lastIndexOf(strUp)){
strB.replace(strB.lastIndexOf(strUp),strB.lastIndexOf(strUp)+1,strLow);
}else{
strB.replace(strB.indexOf(strUp),strB.lastIndexOf(strUp)+1,strLow);
}
}
String returnStr = strB.toString();
System.out.println("returnStr>>>>>>>>>>>>"+returnStr);
}
}
費了九牛二虎之力才弄出來,哎 ,真是一天不寫代碼手九生,
String str = "SDsBEaA";
System.out.println(sort(str));
}
public static String sort(String str) {
char[] chars = str.toCharArray();
float[] fs = new float[chars.length];
for (int i = 0; i < fs.length; i++) {
if (chars[i] >= 'a' && chars[i] <= 'z') {
fs[i] = chars[i] - 31.5f;
} else {
fs[i] = chars[i];
}
}
Arrays.sort(fs);
for (int i = 0; i < fs.length; i++) {
if (fs[i] % 1 != 0) {
chars[i] = (char) (fs[i] + 31.5);
} else {
chars[i] = (char) fs[i];
}
}
return new String(chars);
}
}
public class testSort {
public String sort(String param){
char c[]=param.toCharArray();
String s1;
String s2; for(int i=0;i < c.length;i++){
s1 =String.valueOf(c[0]);
for(int j=1;j<c.length;j++){
s2 = String.valueOf(c[j]);
if(s1.compareToIgnoreCase(s2)>0 || (s1.compareToIgnoreCase(s2)==0 && s1.compareTo(s2)>0)){ s1 = String.valueOf(c[j]);
c[j] = c[j-1];
c[j-1] = s1.charAt(0);
}
}
}
return new String(c);
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String s="SDsBEaA";
testSort test=new testSort();
s=test.sort(s);
System.out.println(s);
}}
等 级:
发表于:2007-11-23 09:50:537楼 得分:0
给小写的字符减去31.5再用ascii比较,排序就ok
=======================================
顶!好方法
s1 =String.valueOf(c[0]);c[0] 应该为c[i]
并且该语句应该放入第二个for循环内部
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class StringTest { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "aBAaACEbcfgeediFHH";
//转换为小写,供正则匹配替换,大写也行
String tmp = str.toLowerCase();
char[] chs = tmp.toCharArray();
//必须排序,否则正则无法替换,也可能是我不知道怎么写,哪位朋友写写
Arrays.sort(chs);
tmp = String.valueOf(chs);
//替换所有重复的字符,替换后的结果为:abcdefghi
String sigle = tmp.replaceAll("(.).*\\1","$1");
char[] t = sigle.toCharArray();
String tmpRes = "";
for (int i = 0; i < t.length; i++){
int upCount = getStrRepeat(str,t[i],true);
int lowCount = getStrRepeat(str,t[i],false);
String rsUP = getString(String.valueOf(t[i]).toUpperCase(),upCount);
String rsLow = getString(String.valueOf(t[i]),lowCount);
tmpRes += (rsUP + rsLow);//大写在前小写在后
}
System.out.println(tmpRes);
//输出:AAaaBbCcdEeeFfgHHi
}
//获取大小写字母出现的次数
//true:大写;false:小写
public static int getStrRepeat(String base,char s,boolean flag){
Pattern p = null;
p = flag?Pattern.compile(String.valueOf(s).toUpperCase()):Pattern.compile(String.valueOf(s));
Matcher m = p.matcher(base);
int i = 0;
while(m.find()){
i++;
}
return i;
}
//根据字母重复次数构造字符串
public static String getString(String s,int count){
if (count == 1)
return s;
else if (count == 0)
return "";
else
return s + getString(s,count - 1);
}
}
楼主给分吧
并不是所要的结果。
* @param args
*/
public static void main(String[] args) {
String s="SDsBEaA" ;
char[] c=s.toCharArray();
for(int i=0;i<c.length;i++)
{
int k=i;
char temp;
char min='z';
for(int j=i;j<c.length;j++){
char temp1=Character.toUpperCase(c[j]);
if(temp1<min)
{
min=temp1;
k=j;
}
}
if(k!=i){
temp=c[i];
c[i]=c[k];
c[k]=temp;
}
}
for(int i=0;i<c.length-1;i++)
{
char temp;
if(c[i]>c[i+1]&&Character.toUpperCase(c[i])==Character.toUpperCase(c[i+1]))
{
temp=c[i];
c[i]=c[i+1];
c[i+1]=temp;
}
}
s=new String(c);
System.out.println(s); }}
看了半天就这个好!
char[] stringChar = str.toCharArray();
double[] stringDouble = new double[str.length()];
int i = 0;
int j = 0;
double tempDouble = 0.0d;
int paramLength = str.length();
// 下面对小写字母减去31.5
for (i = 0; i < paramLength; i++) {
if ((int) stringChar[i] > 96 && (int) stringChar[i] < 123) {
stringDouble[i] = (double) stringChar[i] - 31.5;
} else {
stringDouble[i] = (double) stringChar[i];
}
}
// 下面进行排序 升序
for (i = 0; i < paramLength - 1; i++) {
for (j = 0; j < paramLength - i - 1; j++) {
if (stringDouble[j] > stringDouble[j + 1]) {
tempDouble = stringDouble[j];
stringDouble[j] = stringDouble[j + 1];
stringDouble[j + 1] = tempDouble;
}
}
}
// 还原小写字母
for (i = 0; i < paramLength; i++) {
tempDouble = stringDouble[i] * 10 % 10;
if (tempDouble > 0.0000001) {// 有小数
stringDouble[i] = (double) (stringDouble[i] + 31.5);
}
stringChar[i] = (char) stringDouble[i]; }
return new String(stringChar);
} public static void main(String[] args) {
// String stringExample =
// "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
String stringExample = new String("SDsBEaA");
CharacterSort characterSort = new CharacterSort();
System.out.println(stringExample);
System.out.println(characterSort.stringSort(stringExample));
}
}
其中的
if(temp1==temp2){
temp1=c[i];
temp2=c[i+1];
}
是什么意思呢, 我看了半天也不知道什么意思?
public static void main(String args[]) {
String s = "SDsBEaA";
char[] c = s.toCharArray();
for (int j = 0; j < c.length; j++) {
for (int i = 0; i < c.length-j - 1; i++) {
char temp1 = Character.toUpperCase(c[i]);
char temp2 = Character.toUpperCase(c[i + 1]); if (temp1==temp2) {
temp1 = c[i];
temp2 = c[i + 1];
} if (temp1 > temp2) {
char temp = c[i];
c[i] = c[i + 1];
c[i + 1] = temp;
} }
}
s = new String(c);
System.out.println(s); }
}
import java.util.*;
public class TestSort{
public static void main(String args[]){
String str = "SDsBEAa";
char[] chs = str.toCharArray();
ArrayList<Character> al = new ArrayList<Character>();
for(char c:chs)
al.add(c);
Collections.sort(al,new Comparator<Character>(){
public int compare(Character ch1,Character ch2){
char c1 = Character.toUpperCase(ch1);
char c2 = Character.toUpperCase(ch2);
return c1-c2;
}
} );
System.out.println(al);
}
import java.util.*;
public class TestSort{
public static void main(String args[]){
String str = "SDsBEAa";
char[] chs = str.toCharArray();
ArrayList<Character> al = new ArrayList<Character>();
for(char c:chs)
al.add(c);
Collections.sort(al,new Comparator<Character>(){
public int compare(Character ch1,Character ch2){
char c1 = Character.toUpperCase(ch1);
char c2 = Character.toUpperCase(ch2);
return c1-c2;
}
} );
System.out.println(al);
}
A-Z 用0开始的偶数来表示,a-z 用1开始的奇数来表示。import java.util.Arrays;public class Main { public static void main(String[] args) {
String s = "SDsBEaA";
char[] carr = s.toCharArray(); for (int i = 0; i < carr.length; i++) {
if (carr[i] >= 'A' && carr[i] <= 'Z') {
carr[i] = (char) ((carr[i] - 'A') * 2);
} else {
carr[i] = (char) ((carr[i] - 'a') * 2 + 1);
}
} Arrays.sort(carr); for (int i = 0; i < carr.length; i++) {
if (carr[i] % 2 == 0) {
carr[i] = (char) (carr[i] / 2 + 'A');
} else {
carr[i] = (char) (carr[i] / 2 + 'a');
}
} for (char t : carr) {
System.out.print(t);
}
}
}
public class TestSort{
public static void main(String args[]){
String str = "SDsBEAa";
char[] chs = str.toCharArray();
ArrayList<Character> al = new ArrayList<Character>();
for(char c:chs)
al.add(c);
Collections.sort(al,new Comparator<Character>(){
public int compare(Character ch1,Character ch2){
char c1 = Character.toUpperCase(ch1);
char c2 = Character.toUpperCase(ch2);
if(c1==c2&&ch1>ch2)
return 1;
return c1-c2;
}
} );
System.out.println(al);
}
}
一大堆的字符、数字比较操作,整那些花里胡哨的干嘛,看的偶晕乎乎的。实现Comparator接口的45楼,简单易懂才是美,呵呵!支持之!
Collections.sort(List<T> list, Comparator<? super T> c)
思路:1.先将字母顺序排好,就是按照AaBbCc...Zz排好。
2.将接收的元素依次对应排好的顺序,有则打印。由于1的前提可以保证顺序一定正确。
代码如下:
import java.util.Scanner;class Paixu{
void sort(char[] c){
char[] c1 = new char[100];
int i=0,j=0;
for(i=0;i<27;i++) //先定义位置排好数组c1 (各字母大小写依次)
{
c1[2*i] = (char)('A'+j);
c1[2*i+1]= (char)('a'+j);
j++;
}
for(i=0;i<53;i++) //将接收的数组元素位置匹配到排好的数组里并打印
for(j=0;j<c.length;j++)
if(c1[i]==c[j])
System.out.println(c1[i]);
}
}
public class Asc {
public static void main(String[] args){
Scanner sca = new Scanner(System.in);
String str = sca.next();
new Paixu().sort(str.toCharArray());
}}
public static void main(String[] args) {
String sequence = "SDsBEaA";
List<String> list = new LinkedList<String>(); for(char s : sequence.toCharArray()) {
list.add(String.valueOf(s));
} Collections.sort(list, new Comparator<String>() {
public int compare(String o1, String o2) { double i1 = (double) o1.toCharArray()[0];
double i2 = (double) o2.toCharArray()[0]; if (i1 < 91) {
i1 += 31.5f;
} if (i2 < 91) {
i2 += 31.5f;
} if (i1 > i2) {
return 1;
} else if (i1 == i2) {
return 0;
} else {
return -1;
}
}
}); System.out.println(list.toString());
}
}