如何排序整数数组而不丢失位置

时间:2016-01-24 23:02:24

标签: java arrays sorting

我正在创建一个程序,它接收一个字符串作为输入,并返回每个单词的每个字母的值的“总和”。

例如,我输入的"Take advantage, do your best, don't stress."将返回:

do(19) take(37) dont(43) best(46) advantage(75) your(79) stress(100)

"do"的值为19,因为字母"d"的值为4(它是字母表的第四个字母),而“o”的值为15,所以总数是19。

现在要存储这些值,我有两个数组,每个字一个字符串数组,以及一个用于它们所拥有的点值的int数组。但是,到目前为止我只有这个:

take(37) advantage(75) do(19) your(79) best(46) dont(53) stress(100) 

正如您所看到的,它没有像我想要的那样按升序排序。我这样显示这些值:

System.out.print(words[j] + "(" + points[j] + ")" + " ");

其中words是String数组,points是int数组。我怎样才能对它们进行排序?

我目前的代码:

public static void main (String[] args)
{
    String input = "Take advantage, do your best, don't stress.";
    String output = "";


    //Get rid of all punctuation
    for(int i = 0; i < input.length(); i++){
        if(   ( (int)input.charAt(i) >= 65 && (int)input.charAt(i) <= 90) || (int)input.charAt(i) == 32  || ( (int)input.charAt(i) >= 97 && (int)input.charAt(i) <= 122)){

            //Handles Uppercase
            if(input.charAt(i) >= 65 && input.charAt(i) <= 90){
                int temp = (int)input.charAt(i) + 32;
                char c = (char)temp;
                output += c;
            }
            //Handles all other characters
            else{
                output += input.charAt(i);
            }
        }
    }
    //Done punctuation

    String[] words = output.split(" ");
    int[] points = new int[words.length];

    //Points assignment
    for(int j = 0; j < words.length; j++){
        for(int k = 0; k < words[j].length(); k++){
            points[j] += (int)words[j].charAt(k) - 96;
        }
        System.out.print(words[j] + "(" + points[j] + ")" + " ");
    }
}

4 个答案:

答案 0 :(得分:1)

如何将结果存储在Map<String,Integer>而不是两个列表中:

Map myMap = new HashMap<String,Integer>;

从那里,您可以按地图的值对其进行排序:Sort a Map<Key, Value> by values (Java)

接下来,您可以遍历已排序的地图:

for(String s : myMap.keySet()){
    System.out.println(s+"("+myMap.get(s)+")");
}

答案 1 :(得分:1)

如果这是一个选项,那么使用Java 8可以使代码更多更简单。

首先,可以使用简单的正则表达式来删除标点符号:您只想保留字母,因此我们可以删除既不是字母也不是空格的所有内容。这是通过调用replaceAll("[^a-zA-Z\\s]", "")来完成的。之后,我们可以通过分割"\\s+"(即所有空白字符)来获取所有单词。

然后,让我们创建一个返回String值的辅助方法。正如你在问题中所说,这只是:

private static int value(String str) {
    return str.chars().map(c -> c - 'a' + 1).sum();
}

最后,我们需要用比较器对单词数组进行排序,比较每个单词的值。比较器是在Comparator.comparingInt(keyExtractor)的帮助下创建的,其中键提取将是返回单词值的函数。在这种情况下,它可以表示为lambda表达式:word -> value(word)

要获得最终输出,我们需要将单词数组转换为String,其中每个单词与括号中的值连接。这是通过创建Stream<String>单词(Arrays.stream(array)),根据上面的比较器(sorted(comparator))对其进行排序,将每个单词映射到将其值连接到它的结果,最后完成的。将其收集到由空格(Collectors.joining(delimiter))分隔的String

整个代码将是:

public static void main(String[] args) {
    String str = "Take advantage, do your best, don't stress.";
    String[] words = str.toLowerCase().replaceAll("[^a-zA-Z\\s]", "").split("\\s+");
    String output = 
        Arrays.stream(words)
              .sorted(Comparator.comparingInt(w -> value(w)))
              .map(w -> w + "(" + value(w) + ")")
              .collect(Collectors.joining(" "));
    System.out.println(output);
}

private static int value(String str) {
    return str.chars().map(c -> c - 'a' + 1).sum();
}

答案 2 :(得分:1)

使用任何排序算法并对两个数组进行排序。例如:

public static void bubbleSort(int[] numArray, String[] words) {

    int n = numArray.length;
    int temp = 0;
    String tt;

    for (int i = 0; i < n; i++) {
        for (int j = 1; j < (n - i); j++) {

            if (numArray[j - 1] > numArray[j]) {
                temp = numArray[j - 1];
                tt=words[j-1];
                numArray[j - 1] = numArray[j];
                words[j-1]=words[j];
                numArray[j] = temp;
                words[j]=tt;
            }

然后将主函数的最后一部分更改为:

    String[] words = output.split(" ");
    int[] points = new int[words.length];

    //Points assignment
    for(int j = 0; j < words.length; j++){
        for(int k = 0; k < words[j].length(); k++){
            points[j] += (int)words[j].charAt(k) - 96;
        }

    }
    bubbleSort(points,words);
    for(int j = 0; j < words.length; j++){
        System.out.print(words[j] + "(" + points[j] + ")" + " ");

    }

答案 3 :(得分:1)

如果不允许使用Java 8(否则使用@Tunaki&#39;方法),创建一个Comparable对象,保留两个值,String(单词)和{{ 1}}(总和)。然后,只需将每个单词添加到列表中,然后使用int对其进行排序。

Collections.sort(yourList)