简体   繁体   English

如何在不使用Array.sort:Java的情况下按字母顺序对数组进行排序

[英]How to sort array in alphabetical order without using Array.sort:Java

I want to sort values of an array in alphabetical order in Java.I am stuck at going over the array again and get the output. 我想在Java中按字母顺序对数组的值进行排序。我再次查看数组并获得输出。 My intention is to : Go over the words array, Find the largest string (lexicographically), Once it is found, insert the word at the end of the sortedWords array, Shift the sortedArray's index by one position to the left, Reduce the original array by removing the word already found, Loop again to find the next word.... 我的目的是:遍历单词数组,找到最大的字符串(按字典顺序排列),找到它后,在sortedWords数组的末尾插入单词,将sortedArray的索引向左移动一个位置,减少原始数组删除已经找到的单词,再次循环找到下一个单词....

Thanks for your help. 谢谢你的帮助。

Following is what I have done so far. 以下是我到目前为止所做的工作。

public class Main { 公共类Main {

public static void main(String[] args) {
    String[] words = {"bob","alice","keith","zoe","sarah","gary"};
    String[] sortedWords = new String[words.length];

    // Copy of the original array
    for(int i = 0; i < sortedWords.length;i++){
        sortedWords[i]= words[i];
    }


    for (int i = 0; i < words.length - 1; i++) {
    int currentSize = words.length;
    int position = 0;
    boolean found = false;
    while (position < currentSize && !found) {
        if (words[i].equals(largestAlphabetically(words))) {
            found = true;

        } else {
            position++;
        }
    }

        if(found){
            insertAtEnd(words,largestAlphabetically(words));
            shiftLeft(sortedWords,i);
            shorterArray(words);

        }

    }
    for(int i = 0;i < sortedWords.length;i++){
        System.out.println(sortedWords[i]);
    }

}


/**
 * This method inserts the largest string lexicographically at the end of the array
 * @param words
 * @param wordToInsert
 * @return an array with string at the end
 */

public static String [] insertAtEnd(String[] words, String wordToInsert) {

    for (int i = 0; i < words.length; i++) {
        int currentSize = words.length - 1;
        wordToInsert = largestAlphabetically(words);
        if (currentSize < words.length) {
            currentSize++;
            words[currentSize - 1] = wordToInsert;
        }
    }
    return words;
}

/**
 * This method determines the largest string in an array
 * @param words
 * @return largest string lexicographically
 */
public static String largestAlphabetically(String[] words) {
    String searchedValue = words[0];
    for (int i = 0; i < words.length; i++) {

        for (int j = 0; j < words.length; j++) {
            if (words[i].compareToIgnoreCase(words[j]) < 0) {
                searchedValue = words[j];
            }
        }
    }
    return searchedValue;
}

/**
 * To shift the array index to the left
 * @param dest
 * @param from
 */

public static void shiftLeft(String[] dest, int from) {
    for (int i = from + 1; i < dest.length; i++) {
        dest[i - 1] = dest[i];
    }
    dest[dest.length - 1] = dest[0];
}

/**
 * Remove the largest word from a string while maintaining the order of the array
 * @param words
 * @return return a shorter array
 */
public static String [] shorterArray(String[] words) {
    String [] shorterArray = new String[words.length];
    int currentSize = words.length;
    String searchedValue = largestAlphabetically(words);
    int position = 0;
    boolean found = false;
    while (position < currentSize && !found) {
        if (words[position] == searchedValue) {
            found = true;

        } else {
            position++;
        }
    }
    if (found) {
        for (int i = position + 1; i < currentSize; i++) {
            words[i - 1] = words[i];

        }
        currentSize--;
        shorterArray = words;
    }

    return shorterArray;

}

} }

Simple implementation can be like this: 简单的实现可以是这样的:

String[] words = {"bob","alice","keith","zoe","sarah","gary"};

boolean isSwapped = false;
do {
    isSwapped = false;
    for(int i=0;i<words.length-1;i++){
        if(words[i].compareTo(words[i+1])>0){
            String temp = words[i+1];
            words[i+1] = words[i];
            words[i] = temp;
            isSwapped = true;
        }
    }
}while((isSwapped));

I don't know why you don't want to use Arrays.sort() or Collections.sort(), anyway if you really want to implement a simple sorting algorithm you can start from insertion sort as suggested in some comments. 我不知道为什么你不想使用Arrays.sort()或Collections.sort(),无论如何,如果你真的想要实现一个简单的排序算法,你可以从插入排序开始,如一些评论中所建议的那样。 Here is a simple implementation: 这是一个简单的实现:

String[] words = {"bob","alice","keith","zoe","sarah","gary"};
for(int i = 0; i < words.length; i++)
{
    int smallest = i;
    for(int j = i + 1; j < words.length; j++) // here you find the index of the minimum String between the strings in the unsorted side of the array
    {
        if(words[j].compareTo(words[i]) < 0)
            smallest = j;
    }
    //put the new minimum in the i-th position.
    String aux = words[i];
    words[i] = words[smallest];
    words[smallest] = aux;
}
for(int i = 0; i < words.length; i++)
{
    System.out.println(words[i]);
}

Note that this is in-place sorting so you don't need an auxiliary array. 请注意,这是就地排序,因此您不需要辅助数组。 Hope it is clear 希望很清楚

You can compare two strings like this: 你可以像这样比较两个字符串:

"a".compareTo("b"); // returns a negative number, here -1
"a".compareTo("a"); // returns  0
"b".compareTo("a"); // returns a positive number, here 1

So you can write a small Blubblesort. 所以你可以写一个小Blubblesort。 Link: https://en.wikipedia.org/wiki/Bubble_sort 链接: https//en.wikipedia.org/wiki/Bubble_sort

A heap sort seems to be the best way to sort your string of arrays in lexicographical order. 堆排序似乎是按字典顺序对数组字符串进行排序的最佳方法。 A binary max heap would be the way to go. 二进制最大堆将是要走的路。 In Java, it can be implemented using PriorityQueue . 在Java中,它可以使用PriorityQueue实现。

I had written a BinaryMinHeap using a self-written interface of a PriorityQueue . 我使用PriorityQueue的自编程接口编写了BinaryMinHeap You will find the project here . 你会在这里找到这个项目。 [Please take care not to copy any code without citation.] [请注意不要在没有引用的情况下复制任何代码。]

Does that answer your question? 这是否回答你的问题?

//Use a generic algorithm which can sort any type of data. //使用可以对任何类型的数据进行排序的通用算法。 //Selection sort //选择排序

public class Selection {
static public void sort(Comparable...a){
    int N = a.length;
    for(int i=0;i<N;i++){
        int min = i;
        for(int j=i+1;j<N;j++){
            if(less(a[j],a[min]))
                min = j;
            swap(a,i,min);
        }
    }
}

static private boolean less(Comparable a,Comparable b){
    return a.compareTo(b)<0;//return true if a is a-b<0;meaning a is less than b
}

static private void swap(Comparable[] a,int i,int j){
    Comparable temp = a[i];
    a[i] = a[j];
    a[j] = temp;
}

static public boolean isSorted(Comparable...a){
    int N = a.length;
    for(int i=1;i<N;i++){
        if(less(a[i],a[i-1]))//if a[i]<a[i-1] then the array is not in order. Eg. a[1]=5,a[(1-1=0)]=6 then the isNotSorted
            return false;
    }
    return true;
}

} }

Now using a test client 现在使用测试客户端

public class MainClass{
    String[] words = {"bob","alice","keith","zoe","sarah","gary"};
    for(String word:words){System.out.println(e+" ");}//print the words before sorting
    words.sort(words);
    for(String word:words){System.out.println(e+" ");}//print the words after sorting
}

This algorithm can sort any type of data you want. 该算法可以对您想要的任何类型的数据进行排序。 eg. 例如。 String,Integer and any data type that implements Comparable String,Integer和实现Comparable的任何数据类型

 public boolean isSorted(String[] a) {
        for (int i = 0; i < a.length; i++) {
            if (a[i - 1].compareTo(a[i]) > 0) {
                return false;
            }
        }
        return true;
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM