Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按字母顺序排序ArrayList_Java_Sorting_Arraylist - Fatal编程技术网

Java 按字母顺序排序ArrayList

Java 按字母顺序排序ArrayList,java,sorting,arraylist,Java,Sorting,Arraylist,我试图找到字符串的所有排列并按字母顺序排序 这就是我到目前为止所做的: public class permutations { public static void main(String args[]) { Scanner s = new Scanner(System.in); System.out.print("Enter String: "); String chars = s.next();

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

这就是我到目前为止所做的:

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) + " ");
               }
       }
}
公共类置换{
公共静态void main(字符串参数[]){
扫描仪s=新的扫描仪(System.in);
System.out.print(“输入字符串:”);
字符串chars=s.next();
findPerms(“,chars);
}
公共静态void findPerms(字符串mystr、字符串字符){
List permsList=new ArrayList();

如果(chars.length()在字符串完全填充之前,从查找字符串所有排列的递归方法中调用排序例程

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);
            }

       }
}
import java.util.*;
公共类置换{
公共静态void main(字符串参数[]){
扫描仪s=新的扫描仪(System.in);
System.out.print(“输入字符串:”);
字符串chars=s.next();
List myList=new ArrayList();
findPerms(myList,“,chars);
Collections.sort(myList);

对于(int i=0;i您需要对findperms调用的结果进行排序,而不是在递归调用中进行排序。

请检查:

您可以将已经得到的所有排列放入
树集
优先级队列
中,这样可以将它们按顺序排列。然后您必须将它们放回ArrayList中

或者,您可以使用对ArrayList进行排序的


我推荐最后一个选项。如果您不理解它。

一些注释已经指出,您的递归例程不能在叶节点上进行排序,而希望对整个列表进行排序。您必须返回集合中累积的字符串,然后在最后对其进行排序并打印一次

更重要的是,有一个很好的算法,用于按词序排列数组。它由C++中的NExtx置换函数库(可以用来解释),但是很容易转换成java。
array,可能使用
getCharArray
,使用
array对其进行排序。排序
并运行此操作,直到返回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; 
  }
/**Helper函数*/
无效反向(字符[]a,整数f,整数l)
{
而(l>f)
{
char tmp=a[l];
a[l]=a[f];
a[f]=tmp;
l--;f++;
}
}
/**实际置换函数*/
布尔下一个置换(char[]a)
{
如果(a.length<2)返回false;
对于(int i=a.length-1;i-->0;)
if(a[i]

一旦您了解了它的功能,只需运行
while(next_permutation(array)){println(array);}
就可以了。请注意,对于超过13个元素的数组来说,这是非常糟糕的。

如果您将其设置为
permsList=Collections.sort(permsList),它是否有效
Paul,Collections.sort不返回值。@Paul Tomblin:这不会编译。它不会返回任何内容。它只是对给定集合进行排序。集合不是像
String
一样不可变的。如果对输入字符串(“osty”)中的字母进行排序在您将其传递给findPerms之前,您将得到一个已排序的列表,而无需使用
集合。sort
。DVK我想我知道您的意思,但您能再扩展一点吗?@relyt-我假设Amir的回答提供了足够的解释,如果不能,请回复,我将详细说明该列表也应(递归)传递,而不是不断地重新初始化。打印内容应该从findperms中移出。同意-我将在第二时间发布一些内容。顺便说一句,您发布的代码不会按原样编译。您应该解决这个问题。如果可以,我会的,但我还没有2000 rep;)阿米尔。它确实编译并输出了我上面发布的内容。我仍在根据Matthew指出的内容努力使其正确…但任何其他信息都将不胜感激。当我复制您的代码并将其粘贴到文件中时,由于未导入扫描仪等原因,我收到了编译器错误。我发布了工作解决方案并给出了解释。