如何在不使用collections.sort()的情况下按字母顺序对arraylist进行排序;

时间:2016-03-29 14:15:29

标签: java sorting

我有以下代码,并且我在main方法中按字母顺序对数组列表进行排序,因为用户输入了他的字符串。 这是我的代码:

import java.util.Scanner;
import java.util.ArrayList;

class Main{
  public static void main(String[] args) {
    ArrayList<String> names = new ArrayList<String>();
    Scanner scan = new Scanner(System.in);
    String name;
    do{
      System.out.println("Enter the next name: ");
      name = scan.nextLine();
      String toUpperCase = titleCase(name);
      if(!toUpperCase.equals("Stop")){
        names.add(toUpperCase);
      }
    } while(!name.equalsIgnoreCase("STOP"));

    System.out.println(names.toString());


  }
  public static String titleCase(String s){
    String output = s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
    return output;
  }
}

请不要给出任何通用的答案,我一直在努力解决这个问题。如果你的答案看起来很简单,那可能不适合我。

4 个答案:

答案 0 :(得分:2)

替换此行:

names.add(toUpperCase);

用这个:

int index = names.size();
for (int i = 0; i < names.size(); i++) {
    if (names.get(i).compareTo(toUpperCase) > 0) {
        index = i;
        break;
    }
}
names.add(index, toUpperCase);

所以,每当你有来自用户的新字符串时 - 你会将它插入数组列表的正确位置

这种方法很慢,但对于家庭作业来说还可以

答案 1 :(得分:1)

正如评论中所建议的,在每次插入时维护排序数据结构的最简单方法是使用TreeSet或在内部维护排序顺序的任何其他数据结构。您不需要声明ArrayList<String>,而只需将代码修改为:

Set<String> names = new TreeSet<>();
Scanner scan = new Scanner(System.in);
String name;
do {
  System.out.println("Enter the next name: ");
  name = scan.nextLine();
  String toUpperCase = titleCase(name);
  if(!toUpperCase.equals("Stop")){
    names.add(toUpperCase);
  }
} while(!name.equalsIgnoreCase("STOP"));

来自TreeSet的Javadocs:

  

Set接口是根据equals操作定义的,但是TreeSet实例使用compareTo(或compare)方法执行所有元素比较,因此从集合的角度来看,这个方法认为相同的两个元素是,平等。集合的行为即使其排序与equals不一致也是明确定义的;它只是没有遵守Set接口的一般合同。

答案 2 :(得分:0)

请尝试以下代码。您可以使用更有效的算法替换排序算法,例如合并排序/选择排序等。

import java.util.Scanner;
import java.util.ArrayList;

class alsort{
  public static void main(String[] args) {
    ArrayList<String> names = new ArrayList<String>();
    Scanner scan = new Scanner(System.in);
    String name;
    do{
      System.out.println("Enter the next name: ");
      name = scan.nextLine();
      String toUpperCase = titleCase(name);
      if(!toUpperCase.equals("Stop")){
        names.add(toUpperCase);
      }
    } while(!name.equalsIgnoreCase("STOP"));

    System.out.println(names.toString());

    for(int i=0;i<name.length();i++){
        for(int j=i;j<=name.length();j++){
            if(names.get(i).compareTo(names.get(j))>0){
                String tmp=names.get(i);
                names.set(i, names.get(j));
                names.set(j, tmp);
            }
        }
    }

    System.out.println(names.toString());


  }
  public static String titleCase(String s){
    String output = s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
    return output;
  }
}

答案 3 :(得分:0)

public class SortedArrayList<T> extends ArrayList<T> {

        /**
     * 
     */
    private static final long serialVersionUID = 1L;


        @SuppressWarnings("unchecked")
        public void insertSorted(T value) {
            add(value);
            Comparable<T> cmp = (Comparable<T>) value;
            for (int i = size()-1; i > 0 && cmp.compareTo(get(i-1)) < 0; i--)
                Collections.swap(this, i, i-1);
        }


    public static void main(String[] s){        
        SortedArrayList<String> myList = new SortedArrayList<String>();

        myList.insertSorted("ddd");   
        myList.insertSorted("aaa");
        myList.insertSorted("xyz"); 
        System.out.println(myList);     
    }



}