按顺序排列char数组

时间:2014-01-09 07:06:51

标签: java alphabet

我遇到了一篇文章,展示了如何按字母顺序排列字符数组。 看到这个可以完成,我想按输入字符串的字符顺序输出输入字符串的每个字符的字母顺序。

我有点卡住了。我可以按字母顺序重新排序字符串,但我不知道下一步该做什么。

例如'monkey'到'354216'

因为'ekmnoy'e按字母顺序首先从给定字符集开始,因此e = 1,k是排序时的第二个alpha字符,因此k = 2,依此类推。

如果你无法理解我可以提供更多的例子来清楚地说明。

代码

    String str = "airport";
        Character[] chars = new Character[str.length()];
        for (int z = 0; z < chars.length; z++) {
            chars[z] = str.charAt(z);
        }


        Arrays.sort(chars, new Comparator<Character>() {
            public int compare(Character c1, Character c2) {
                int cmp = Character.compare(
                        Character.toLowerCase(c1.charValue()),
                        Character.toLowerCase(c2.charValue()));
                if (cmp != 0) {
                    return cmp;
                }
                return Character.compare(c1.charValue(), c2.charValue());
            }
        });


        StringBuilder sb = new StringBuilder(chars.length);
        for (char c : chars) {
            sb.append(c);
        }
        str = sb.toString();

        System.out.println(sb);

输出

aioprrt

预期产出

Orange -> aegnOr
561432 -  123456

Monkey -> ekMnoy
354216 -> 123456

3 个答案:

答案 0 :(得分:1)

按顺序排列字符后(与原始字符不同)然后通过遍历原始字符串并从te排序字符串中选择每个字符的索引来创建第三个数组。

input:  edcba
sorted: abcde
index:  01234

...伪代码

for( int i = 0; i < input.length(); i++ ) {
    index[i] = sorted.indexOf(input[i]);
}

给定输入结果应为43210。

请注意,超过10个字符的字符串将导致输出不明确,可以通过在输出中插入空格来处理。示例:

abcdefghijk -> 
012345678910

答案 1 :(得分:1)

我不知道你想用双字符做什么,但是如果你最后在你的代码中添加这几行,你就会得到正确的结果。 遍历排序的String并将原始String中的charakters替换为已排序String中的索引。

String originalStr = "airport";
for(int i = 0; i<str.length(); i++) {
    originalStr = originalStr.replace(str.charAt(i), String.valueOf(i+1).charAt(0));
}
System.out.println(originalStr);

输出:1254357

如果您想获得输出:1254367使用replaceFirst

 originalStr = originalStr.replaceFirst(String.valueOf(str.charAt(i)), String.valueOf(i+1));


Input:Orange
Output:561432

Input:Monkey
Output:354216

整个代码:

    String str = "airport";
    String originalStr = str; //creat a backup of str because you change it in your code
    Character[] chars = str.toCharArray();


    Arrays.sort(chars, new Comparator<Character>() {
        public int compare(Character c1, Character c2) {
            int cmp = Character.compare(
                    Character.toLowerCase(c1.charValue()),
                    Character.toLowerCase(c2.charValue()));
            if (cmp != 0) {
                return cmp;
            }
            return Character.compare(c1.charValue(), c2.charValue());
        }
    });

    str = String.valueOf(chars);
    System.out.println(str);


    //Iterate over the sorted String and replace the charakters in the original String with their indices in the sorted String
    for(int i = 0; i<str.length(); i++) {
        originalStr = originalStr.replaceFirst(String.valueOf(str.charAt(i)), String.valueOf(i+1));
    }
    System.out.println(originalStr);

答案 2 :(得分:0)

您可以使用以下代码:

package Test;

import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;

public class Arrange {
    public static void main(String[] args) {
        String str = "money";
        List<Test> strs=new LinkedList<Test>();
        List<Test> final_result=new LinkedList<Test>();
        for(int i=0;i<str.length();i++)
        {
            Test t=new Test(i, ""+str.charAt(i), 0);
            strs.add(t);
        }
        Collections.sort(strs,new Comparator<Test>() {
               @Override
               public int compare(Test o1, Test o2) {
                   return (o1.getS().compareToIgnoreCase(o2.getS()));
               }
           });
        Integer i=1;
        for (Test st : strs) {
           st.setJ(i);
           final_result.add(st);
           i++;
       }
        Collections.sort(final_result,new Comparator<Test>() {
            @Override
            public int compare(Test o1, Test o2) {
                return (o1.getI().compareTo(o2.getI()));
            }
        });
        for (Test test : final_result) {
            System.out.println(test.getJ());
        }
   }
}

class Test{
    private Integer i;
    private String s;
    private Integer j;
    public Test() {
        // TODO Auto-generated constructor stub
    }
    public Test(Integer i, String s, Integer j) {
        super();
        this.i = i;
        this.s = s;
        this.j = j;
    }
    public Integer getI() {
        return i;
    }
    public void setI(Integer i) {
        this.i = i;
    }
    public String getS() {
        return s;
    }
    public void setS(String s) {
        this.s = s;
    }
    public Integer getJ() {
        return j;
    }
    public void setJ(Integer j) {
        this.j = j;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((i == null) ? 0 : i.hashCode());
        result = prime * result + ((j == null) ? 0 : j.hashCode());
        result = prime * result + ((s == null) ? 0 : s.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Test other = (Test) obj;
        if (i == null) {
            if (other.i != null)
                return false;
        } else if (!i.equals(other.i))
            return false;
        if (j == null) {
            if (other.j != null)
                return false;
        } else if (!j.equals(other.j))
            return false;
        if (s == null) {
            if (other.s != null)
                return false;
        } else if (!s.equals(other.s))
            return false;
        return true;
    }
}