落子鸢
2017-05-06 11:38:04浏览 3928
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Perm {
int n =0;//如果输入的元素个数超过8n则需要用long类型
List<String>lists = new ArrayList<>();
/**
* 读取文件内待排列的数据
* @return
* @throws IOException
*/
public String [] in_file_qpl(String infile) throws IOException{
BufferedReader in =new BufferedReader(
new InputStreamReader(
new FileInputStream(infile)));
List<String> list = new ArrayList<>();
String line ;
while ((line = in.readLine())!=null ) {
list.add(line);
}
String[] a = list.toArray(new String[list.size()]) ;
System.out.println(a.length);
in.close();
return a;
}
public void out_file_qpl(String outfile , List<String> lists) throws IOException{
System.out.println(lists.isEmpty());
FileOutputStream fos = new FileOutputStream(outfile);
byte [] buf = new byte[8*1024];
String buff= null;
for (int i = 0; i < lists.size(); i++) {
buff= lists.get(i);
buf = buff.getBytes();
fos.write(buf);
fos.write("\r\n".getBytes());
fos.flush();
}
fos.close();
}
/**
* @param infile
* @param outfile
* @throws IOException
* 驱动函数 传入输入与输出文件的地址
*/
public void perm(String infile ,String outfile) throws IOException{
String[] list = in_file_qpl(infile);
Arrays.sort(list);
perm(list, 0, list.length-1);
out_file_qpl(outfile, lists);
}
/**
* @param list
* @param k
* @param m
* @param n
* @return 返回储存有所有全排列的string数组
* list 的第 0~ k-1 个元素作为前缀、第 k~m-1 个元素进行全排列得到的全排列
*/
public void perm(String[] list ,int k ,int m ){
int i ;
if(k>m){
n++;
System.out.println("第"+n +"个排列为: " + Arrays.toString(list));
lists.add( Arrays.toString(list));
System.out.println();
}else{
for( i = k; i<=m ; i++){
swap1(list, k , i);
perm(list, k+1, m);
swap2(list, k , i);
}
}
}
/**
* 交换数组中a和b位置上的元素
* @param list
* @param a
* @param b
*/
public void swap( String [] list, int a , int b){
String m =list[a] ;
list[a] = list[b];
list[b] = m;
}
/**
* list中 将a与a到b-1直间得数向后顺延一个位置,b位置得元素置换a得位置上
* @param a
* @param b
*/
public void swap1(String[] list, int a, int b){
int i ;
String temp ;
temp = list[b];
for(i = b ; i > a; i--){
list[i]=list[i-1];
}
list[a] = temp;
}
/**
* list中 将a-1与a-1到b直间得数向前顺延一个位置,b位置得元素置换a得位置上
* @param a
* @param b
*/
public void swap2 (String [] list, int a, int b){
int i ;
String temp ;
temp = list[a];
for(i = a ; i <b; i++){
list[i]=list[i+1];
}
list[b] = temp;
}
public static void main(String[] args) {
Perm perm = new Perm();
try {
perm.perm("src/inperm.txt", "src/outperm.txt");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(perm.n);
}
}