大计算场景下 N个自然数的全排列问题(三)

2014-11-24 11:54:55 · 作者: · 浏览: 60
= last; j >= i; j--)
if (((Integer) pn.get(j) > (Integer) pn.get(i - 1))
&& ((Integer) pn.get(j) < (Integer) pn.get(k)))
k = j;
// 交换p[k]和p[i - 1]
Collections.swap(pn, k, i - 1);
// 倒置p[last]到p[i]
for (j = last, k = i; j > k; j--, k++)
Collections.swap(pn, j, k);
printPermutation(pn);
// 如果超出限制,则停止计算
BigInteger now = Util.changeArrayListToBigInteger(pn);
if (now.compareTo(max) > 0) {
return false;
}
return true;
}
}
interface WriteLog {
void writeLog(String log);
void printPermutation(ArrayList pn);
void setWriter(String fileName);
void closeWrite();
}
class WriteLogToFile implements WriteLog {
ThreadLocal writer = new ThreadLocal();
public void setWriter(String fileName) {
try {
writer.set(new FileWriter(fileName, true));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void closeWrite() {
try {
writer.get().close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* B方法追加文件:使用FileWriter
*
* @param fileName
* @param content
*/
public void appendMethod(String content) {
try {
// 打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
writer.get().write(content);
// 避免频繁的openWrite, closeWrite,增加CPU负担
// writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void writeLog(String log) {
appendMethod(log);
appendMethod("\r\n");
}
@Override
public void printPermutation(ArrayList pn) {
StringBuffer tmp = new StringBuffer();
for (int i = 0; i < pn.size(); i++) {
tmp.append(pn.get(i)).append(",");
}
writeLog(tmp.toString());
}
}
class Util {
public static ArrayList changeStringsToArray(String[] s) {
ArrayList px = new ArrayList(s.length);
for (String x : s) {
px.add(Integer.parseInt(x));
}
return px;
}
public static BigInteger changeArrayListToBigInteger(ArrayList pn) {
StringBuffer orgData = new StringBuffer();
for (int j = 0; j < pn.size(); j++) {
orgData.append(pn.get(j));
}
return new BigInteger(orgData.toString());
}
public static ArrayList changeBigIntegerToArrL(BigInteger tmp) {
String x = tmp.toString();
ArrayList r = new ArrayList();
for (int j = 0; j < x.length(); j++) {
r.add(Integer.parseInt(String.valueOf(x.charAt(j))));
}
return r;
}
}