繁体   English   中英

按字母顺序排序ArrayList

[英]Sort ArrayList alphabetically

我试图找到字符串的所有排列并按字母顺序排序。

这是我到目前为止:

public class permutations {

        public static void main(String args[]) {
            Scanner s = new Scanner(System.in);
            System.out.print("Enter String: ");
            String chars = s.next();
            findPerms("", chars);
        }

        public static void findPerms(String mystr, String chars) {

            List<String> permsList = new ArrayList<String>();

                if (chars.length() <= 1)
                        permsList.add(mystr + chars);
                        //System.out.print(mystr + chars + " ");

                else
                        for (int i = 0; i < chars.length(); i++) {
                            String newString = chars.substring(0, i) + chars.substring(i + 1);
                            findPerms(mystr + chars.charAt(i), newString);
                        }

               Collections.sort(permsList);

               for(int i=0; i<permsList.size(); i++) {
                    System.out.print(permsList.get(i) + " ");
               }
       }
}

如果我输入一个字符串“玩具”,我得到:

玩具tosy tyos tyso tsoy tsyo otys otsy oyts oyst osty osyt ytos ytso yots yost ysto ysot stoy styo soty soyt syto syot

我究竟做错了什么。 我怎样才能按字母顺序排列它们? 谢谢!

您正在从递归方法中调用您的排序例程,该方法在完全填充之前查找String的所有排列。

import java.util.*;

public class permutations {

        public static void main(String args[]) {
            Scanner s = new Scanner(System.in);
            System.out.print("Enter String: ");
            String chars = s.next();
            List<String> myList = new ArrayList<String>();
            findPerms(myList, "", chars);

            Collections.sort(myList);

            for(int i=0; i<myList.size(); i++) {
               System.out.print(myList.get(i) + " ");
            }

        }

        public static void findPerms(List<String> permsList, String mystr, String chars) {

            if (chars.length() <= 1)
                permsList.add(mystr + chars);    
            else
            for (int i = 0; i < chars.length(); i++) {
                String newString = chars.substring(0, i) + chars.substring(i + 1);
                findPerms(permsList, mystr + chars.charAt(i), newString);
            }

       }
}

一些注释已经指出,您的递归例程无法对叶节点进行排序,并期望对整个列表进行排序。 您必须返回集合中的累积字符串,然后在最后对它们进行排序和打印。

更重要的是,有一个很好的算法可以按词汇顺序排列数组。 它被C ++中的next_permutation库函数使用(您可以查找解释),但它很容易转换为java。 您可以使用getCharArray提取char[]数组,使用Arrays.sort对其进行Arrays.sort并运行它直到它返回false。

/** Helper function */
void reverse(char[] a, int f, int l)
  {
  while(l>f)
    {
    char tmp = a[l];
    a[l] = a[f];
    a[f] = tmp;
    l--; f++;
    }
  }

/** actual permutation function */
boolean next_permutation(char[] a)
  {
  if(a.length < 2) return false;
  for(int i = a.length-1; i-->0;)
    if(a[i] < a[i+1]) 
    { 
    int j=a.length-1;
    while(!(a[i] < a[j]))
      j--;
    char tmp=a[i];
    a[i]=a[j];
    a[j]=tmp;
    reverse(a, i+1, a.length-1); 
    return true; 
    }
  reverse(a, 0, a.length-1); 
  return false; 
  }

一旦你理解它的作用,只需运行while(next_permutation(array)) {println(array);}并且你做得很好。 请注意,这对于超过13个元素的数组来说非常糟糕。

你需要对findperms调用的结果进行排序,而不是在recusive调用中。

您可以放置​​已经获得的所有排列,并将它们放在TreeSetPriorityQueue ,这将使它们按顺序排列。 然后,您必须将它们放回到ArrayList中。

或者您可以使用Collections Sort对ArrayList进行排序

我推荐最后一个选项。 如果您不理解, 这是一个示例

暂无
暂无

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

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