递归实现,取数字(字符串)中第i个位置的字符,然后将他和剩余的字符拼接,剩余的字符串当成有一个全排列的输入,这样递归下去,只剩一个字符时全排列就是本身。程序中使用set去除了重复的数据,如果需要保留,将set换为list接口即可。
网站建设哪家好,找成都创新互联公司!专注于网页设计、网站建设、微信开发、微信小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了鄱阳免费建站欢迎大家使用!
package mytest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
/*
* @date:2012-2-8
* @author:
*
* 输入一个数字,讲输出 1到这个数字的全排列
*/
public class MyDemo2 {
private static SetString SET_STRING = new HashSetString();
private static SetLong SET_NUM = new HashSetLong();
public static void main(String[] args) {
System.out.println("begin ...... ");
testLong(234);
testString("a23");
print(SET_NUM);
print(SET_STRING);
System.out.println("end ...... ");
}
/**
* 测试数字
* @param num
*/
private static void testLong(long num){
long testNum = num;
String[] permutation;
for(long l=0; l=testNum; l++){
permutation = getAllOrder(String.valueOf(l));
for (int i = 0; i permutation.length; i++) {
SET_NUM.add(Long.valueOf(permutation[i]));
}
}
}
/**
* 测试字符串
* @param str
*/
private static void testString(String str){
String[] permutation = getAllOrder(str);
for (int i = 0; i permutation.length; i++) {
SET_STRING.add(permutation[i]);
}
}
private static void print(Set set){
System.out.println("/*****************************************************/");
int i=0;
for(Iterator it = set.iterator(); it.hasNext();){
i++;
if(i%10 == 0){
System.out.println();
}
System.out.print(it.next() + " ");
}
System.out.println();
System.out.println("/*****************************************************/");
}
/**
* 递归算法 全排列 去除重复
* @param str
* @return
*/
private static String[] getAllOrder(String str) {
String [] arrResult = null;
SetString set = new HashSetString();
if(str.length()1){
String result = "";
String charXInString;
String remainString;
for (int i = 0; i str.length(); i++) {
charXInString = str.charAt(i) + "";
remainString = str.substring(0, i)+ str.substring(i + 1, str.length());
for (String element : getAllOrder(remainString)) {
result = charXInString + element;
set.add(result);
}
}
arrResult = set.toArray(new String[set.size()]);
}else{
arrResult = new String[]{str};
}
return arrResult;
}
}
尽量用递归好理解一些,打个断点
public class Permutation {
public static void permulation(int[] list, int start, int length) {
int i;
if (start == length) {
for (i = 0; i length; i++)
System.out.print(list[i] + " ");
System.out.println();
} else {
for (i = start; i length; i++) {
swap(list, start, i);
permulation(list, start + 1, length);
swap(list, start, i);
}
}
}
public static void swap(int[] list, int start, int i) {
int temp;
temp = list;
list = list[i];
list[i] = temp;
}
public static void main(String[] args) {
int length = 3;
int start = 0;
int list[] = new int[length];
for (int j = 0; j length; j++)
list[j] = j + 1;
permulation(list, start, length);
}
}
= =~思路什么的...用递归吧:
package mon_11;
import java.util.HashSet;
public class ArrangeAll {
private static HashSetString set = new HashSetString();
public static void arrangeAll(String s) {
put(new StringBuilder(s), new StringBuilder());
}
static void put(StringBuilder s1, StringBuilder s2) {
if (s1.length() == 0)set.add(s2.toString());
for (int i = 0; i s1.length(); i++) {
put(new StringBuilder(s1).deleteCharAt(i),new StringBuilder(s2).append(s1.charAt(i)));
}
}
public static void main(String[] args) {
arrangeAll("abcd");
System.out.println(set);
}
}
----
输出:
[dcab, acdb, acbd, bcda, bdca, bdac, dbca, bacd, cabd, cdba, cdab, badc, dabc, cadb, dbac, bcad, dacb, cbda, cbad, adbc, adcb, abcd, abdc, dcba]
在Java Collection Framework中定义的List实现有Vector ArrayList和LinkedList 这些集合提供了对对象组的索引访问 他们提供了元素的添加与删除支持 然而 它们并没有内置的元素排序支持 你能够使用java util Collections类中的sort()方法对List元素进行排序 你既可以给方法传递一个List对象 也可以传递一个List和一个Comparator 如果列表中的元素全都是相同类型的类 并且这个类实现了Comparable接口 你可以简单的调用Collections sort() 如果这个类没有实现Comparator 你也可以传递一个Comparator到方法sort()中 进行排序 如果你不想使用缺省的分类顺序进行排序 你同样可以传递一个Comparator到方法sort()中来进行排序 如果列表中的元素并不都是相同类型的类 你在进行排序的时候就不是这样幸运了 除非你编写一个专用的跨类的Comparator 排序的顺序怎么样呢?如果元素是String对象 却省的排序顺序是按照字符编码进行的 基本上是每个字符的ASCII/Unicode值 如果严格的限制在处理英文 却省的排序顺序通常是足够的 因为它首先排A Z 然后是小写字母a z 然而如果你处理非英文字 或者你只是想使用不同的排序顺序 这样Collections sort()就出现了第二种变化 例如 你想使用字符串的反序进行排序 为了实现这个功能 你可以在Collections类中通过reverseOrder()来获取一个反序Comparator 然后 你将反序Comparator传递给sort()方法 换句话说 你作如下工作 List list = ;Comparator p = Collections reverseOrder();Collections sort(list p); 如果列表包含项目 Man man Woman 和woman 排序好的列表将是Man Woman man woman 这里没有什么复杂的 需要注意的非常重要的一点是Collections sort()是进行原位排序 如果你需要保留原序 需要先对原集合进行复制 在排序 就像这样 List list = ;List copyOfList = new ArrayList(list);Collections sort(copyOfList); 这里 排好序的列表是 Man Woman man woman 但是原始列表(Man man Woman woman)被保留了 到目前为止 排序是区分大小写的 你如何进行不去分大小写的排序呢?一种实现方式是象这样实现Comparator: public static class CaseInsensitiveComparator implements Comparator {public int pare(Object element Object element ) {String lower = element toString() toLowerCase();String lower = element toString() toLowerCase();return pareTo(lower );}} 你确实不需要手工的创建这个类 而是 你可以是用以存在的Comparator CASE_INSENSIVTIVE_ORDER 它是在String类中定义的 这种实现方式有一点小小的问题 Sort()算法提供稳定的排序 并保持与原有序列相同的元素 这意味着一个包含两个元素 woman 和 Woman 的列表将有不同的排序 而这种不同是根据两个元素在列表中出现的先后次序决定的 语言的不同又会怎么样呢?java text包提供了Collector和CollectionKey类来进行区分语言的排序 这里是例子:注意 如果你的文本是本地语言 而不是缺省语言 你需要传递一个本地语种给getInstance()方法 就象: public static class CollatorComparator implements Comparator {Collator collator = Collator getInstance();public int pare(Object element Object element ) {CollationKey key = collator getCollationKey(element toString());CollationKey key = collator getCollationKey(element toString());return pareTo(key );}} 你是在对集合关键字进行排序 而不是实际的字符串 这不仅提供固定的不区分大小写的排序 而且它是跨语种的排序 换句话说 如果你对西班牙文和非西班牙文的混合词进行排序 词ma?ana (tomorrow)将排在mantra的前面 如果你不使用Collector ma?ana将排在mantra的后面 下面这个程序对一个列表进行不同类型的排序(缺省的 区分大小写的 区分语种的) import java awt BorderLayout;import java awt Container;import java io *;import java text *;import java util *;import javax swing *;public class SortIt {public static class CollatorComparator implements Comparator {Collator collator = Collator getInstance();public int pare(Object element Object element ) {CollationKey key = collator getCollationKey(element toString());CollationKey key = collator getCollationKey(element toString());return pareTo(key );}}public static class CaseInsensitiveComparator implements Comparator {public int pare(Object element Object element ) {String lower = element toString() toLowerCase();String lower = element toString() toLowerCase();return pareTo(lower );}}public static void main(String args[]) {String words[] = { man Man Woman woman Manana manana ma?ana Ma?ana Mantra mantra mantel Mantel };// Create frame to display sortingsJFrame frame = new JFrame( Sorting );frame setDefaultCloseOperation(JFrame EXIT_ON_CLOSE);Container contentPane = frame getContentPane();JTextArea textArea = new JTextArea();JScrollPane pane = new JScrollPane(textArea);contentPane add(pane BorderLayout CENTER);// Create buffer for outputStringWriter buffer = new StringWriter();PrintWriter out = new PrintWriter(buffer);// Create initial list to sortList list = new ArrayList(Arrays asList(words));out println( Original list: );out println(list);out println();// Perform default sortCollections sort(list);out println( Default sorting: );out println(list);out println();// Reset list list = new ArrayList(Arrays asList(words));// Perform case insensitive sortComparator p = new CaseInsensitiveComparator();Collections sort(list p);out println( Case insensitive sorting: );out println(list);out println();// Reset listlist = new ArrayList(Arrays asList(words));// Perform collation sortp = new CollatorComparator();Collections sort(list p);out println( Collator sorting: );out println(list);out println();// Fill text area and displaytextArea setText(buffer toString());frame pack();frame show();}} 如果你的主要问题是顺序访问 可能列表不是你的好的数据结构选择 只要你的集合没有重复 你可以在树(TreeSet)中保存你的元素(提供或不提供Comparator) 这样 元素将总是排序形式的 lishixinzhi/Article/program/Java/hx/201311/26066
public static void main(String[] args) {
System.out.println(KeyEvent.VK_UP);
String a = "1234";
char[] arry = a.toCharArray();
for (int i = 0; i arry.length; i++) {
System.out.println(arry[i]);
}
for (int i = 0; i arry.length; i++) {
for (int j = i + 1; j arry.length; j++) {
System.out.println(arry[i] + "" + arry[j]);
}
}
for (int i = 0; i arry.length; i++) {
for (int j = i + 1; j arry.length; j++) {
for (int z = j + 1; z arry.length; z++) {
System.out.println(arry[i] + "" + arry[j] + "" + arry[z]);
}
}
}
}
程序如下所示,输入格式为:
5
3 1 2 1 2
第一行是数字个数,第二行有n个数,表示待排列的数,输入假设待排序的数均为非负数。
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static final int maxn = 1000;
int n; // 数组元素个数
int[] a; // 数组
boolean[] used; // 递归过程中用到的辅助变量,used[i]表示第i个元素是否已使用
int[] cur; // 保存当前的排列数
// 递归打印无重复全排列,当前打印到第idx位
void print_comb(int idx) {
if(idx == n) { // idx == n时,表示可以将cur输出
for(int i = 0; i n; ++i) {
if(i 0) System.out.print(" ");
System.out.print(cur[i]);
}
System.out.println();
}
int last = -1; // 因为要求无重复,所以last表示上一次搜索的值
for(int i = 0; i n; ++i) {
if(used[i]) continue;
if(last == -1 || a[i] != last) { // 不重复且未使用才递归下去
last = a[i];
cur[idx] = a[i];
// 回溯法
used[i] = true;
print_comb(idx + 1);
used[i] = false;
}
}
}
public void go() throws FileNotFoundException
{
Scanner in = new Scanner(new File("data.in"));
// 读取数据并排序
n = in.nextInt();
a = new int[n];
for(int i = 0; i n; ++i) a[i] = in.nextInt();
Arrays.sort(a);
// 初始化辅助变量并开始无重复全排列
cur = new int[n];
used = new boolean[n];
for(int i = 0; i n; ++i) used[i] = false;
print_comb(0);
in.close();
}
public static void main(String[] args) throws FileNotFoundException{
new Main().go();
}
}
客观来说,非递归的无重复全排列比较简单且高效。