[Java实现]已知字母序列【d,g,e,c,f,b,o,a】,请实现一个函数针对输入一组字符串input[]={"bed","dog","dear","eye"} 输出:dear,dog,eye,bed
1)如果这题没有给定字母序列,使用compareTo(str)方法会很快写出程序,默认字母表排序。
String[] strArray = new String[] { "bed", "dog", "dear", "eye" };
int flag = 0;
String tmp;
for (int i = 0; i < strArray.length; i++) {
String str = strArray[i];
for (int j = i; j < strArray.length; j++) {
if(strArray[j].compareTo(str)<=0){
str = strArray[j];
flag = j;
}
}
if (flag != i) {
tmp = strArray[i];
strArray[i] = str;
strArray[flag] = tmp;
}
}
for (String ss : strArray) {
System.out.println(ss);
}
2)那现在给定了字母顺序,我们只要改写compareTo这个方法就行。设计到比较没什么比数字的大小来的更快。那么我把给定的字母序列存入数组中,数组的下标作为每个字符所代表的数值。
第一种方法:
public class StringTest
{
static int charOrder[] = { 'd', 'g', 'e', 'c', 'f', 'b', 'o', 'a' };
public static void main(String[] args)
{
String[] strArray = new String[] { "bed", "dog", "dear", "eye" };
int flag = 0;
String tmp;
for (int i = 0; i < strArray.length; i++) {
String str = strArray[i];
for (int j = i; j < strArray.length; j++) {
if(compareStr(strArray[j],str)<=0){
str = strArray[j];
flag = j;
}
}
if (flag != i) {
tmp = strArray[i];
strArray[i] = str;
strArray[flag] = tmp;
}
}
for (String ss : strArray) {
System.out.println(ss);
}
}
static int compareStr(String str1, String str2)
{
int length1 = str1.length();
int length2 = str2.length();
int len;
if (length1 < length2) {
len = length1;
} else {
len = length2;
}
int[] sortnum1 = new int[len];
int[] sortnum2 = new int[len];
int k = 0;
for (int i = 0; i < len; i++) {
for (int j = 0; j < charOrder.length; j++) {
if (str1.charAt(i) == charOrder[j]) {
sortnum1[k++] = j;
}
}
}
k=0;
for (int i = 0; i < len; i++) {
for (int j = 0; j < charOrder.length; j++) {
if (str2.charAt(i) == charOrder[j]) {
sortnum2[k++] = j;
}
}
}
for (int i = 0; i < len; i++) {
if (sortnum1[i] < sortnum2[i]) {
return -1;
} else if (sortnum1[i] > sortnum2[i])
return 1;
}
if (length1 > length2)
return 1;
else if (length1 < length2)
return -1;
else
return 0;
}
}
第二种方法:
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
public class StringTest3 implements Comparator<String>
{
static char charOrder[] = { 'd', 'g', 'e', 'c', 'f', 'b', 'o', 'a' };
Map<Character, Integer> map = new HashMap<Character, Integer>();
public StringTest3()
{
for (int i = 0; i < charOrder.length; i++) {
map.put(charOrder[i], i);
}
}
@Override
public int compare(String o1, String o2)
{
// TODO Auto-generated method stub
int length1 = o1.length();
int length2 = o2.length();
int len = length1 > length2 ? length1 : length2;
int num;
for (int i = 0; i < len; i++) {
num = map.get(o1.charAt(i)) - map.get(o2.charAt(i));
if(num!=0)return num;
}
return length1-length2;
}
public static void main(String[] args)
{
String[] strArray = new String[] { "bed", "dog", "dear", "eye" };
Arrays.sort(strArray,new StringTest3());
for(int i=0;i<strArray.length;i++)
{
System.out.println(strArray[i]);
}
}
}