java中simulation_Simulation.java

import java.io.*;

import java.math.BigDecimal;

import java.math.RoundingMode;

import java.util.*;

import java.lang.*;

public class Simulation{

public static void main(String []args) {

Simulation simulation = new Simulation();

// DataSet.

try {

boolean created = false;

File dataSetDirectory = new File("dataSet");

if(dataSetDirectory.exists()) {

Scanner choosingNewOrExistScanner = new Scanner(System.in);

System.out.println("Here exists a dataSet, whether create a new one? (Yes/No).");

String choosing = choosingNewOrExistScanner.nextLine();

if(choosing.contentEquals("No")||choosing.contentEquals("N")) {

// Use old dataSet.

// Get the dataSetSize.

File list[] = dataSetDirectory.listFiles();

int counter = 0;

for(int cursor = 0; cursor < list.length; cursor++) {

if(list[cursor].isFile()) {

counter++;

}

}

simulation.setSize(counter);

// Get the dataSize.

File zeroFile = new File("dataSet\\0.txt");

if(zeroFile.exists()) {

FileReader fileReader = new FileReader(zeroFile);

BufferedReader bufferedReader = new BufferedReader(fileReader);

int row=0;

while((bufferedReader.readLine()) != null){

row++;

}

bufferedReader.close();

fileReader.close();

System.out.println(String.format("The dataSet have %d files, %d rows per file.", counter, row));

simulation.setDataSize(row);

created = true;

// Choosing type.

System.out.println("Please input type: '1: Random', '2: Method', '3: Group'.");

String typeString = choosingNewOrExistScanner.nextLine();

choosingNewOrExistScanner.close();

int type = Integer.parseInt(typeString);

simulation.setType(type);

simulation.read();

} else {

System.out.println("The dataSet is wrong, it will create a new one.");

deleteFileOfDirectory(dataSetDirectory);

}

} else {

deleteFileOfDirectory(dataSetDirectory);

}

} else {

// Here not exists 'dataSet' directory.

}

if(!created) {

// Create directory and create new dataSet.

dataSetDirectory.mkdir();

System.out.println("Please input dataSetSize dataSize and Type like '100 100 1', 100 < number < 1000, '1: Random', '2: Method', '3: Group'.");

Scanner inputScanner = new Scanner(System.in);

String argsInput = inputScanner.nextLine();

String[] argsList = argsInput.split(" ");

simulation.init(Integer.parseInt(argsList[0]),

Integer.parseInt(argsList[1]), Integer.parseInt(argsList[2]));

}

Thread.sleep(1000);

} catch (Exception ex) {

ex.printStackTrace();

}

try {

simulation.start();

try {

simulation.writeFile();

System.out.println("The result has saved at 'Result\\report.txt'.");

} catch (IOException ioException) {

ioException.printStackTrace();

System.out.println("Can not save the result.");

simulation.printResult();

}

} catch (IOException ie) {

ie.printStackTrace();

File dataSetDirectory = new File("dataSet");

if(dataSetDirectory.exists()) {

deleteFileOfDirectory(dataSetDirectory);

}

System.out.println("Crashed files have been deleted. Please run it again.");

}

}

public static void deleteFileOfDirectory(File fileDirectory) {

if (fileDirectory == null || !fileDirectory.exists()){

System.out.println("Wrong FileDirectory.");

return;

}

File[] files = fileDirectory.listFiles();

for (File f: files){

String name = f.getName();

System.out.println(String.format("Delete %s", name));

if (f.isDirectory()){

deleteFileOfDirectory(f);

} else {

f.delete();

}

}

fileDirectory.delete();

}

private class DataCreater implements Runnable {

int size;

String name;

@Override

public void run() {

// TODO Auto-generated method stub

ArrayList numberArrayList = new ArrayList();

Random random = new Random();

for(int cursor = this.size - 1; cursor >= 0; cursor--) {

numberArrayList.add(cursor); // Auto boxing reverse input.

}

for(int exchange = 0; exchange < this.size; exchange++) {

double rate = random.nextDouble();

while(rate == 1.0) {

rate = random.nextDouble();

}

int current = (int)numberArrayList.get(exchange);

numberArrayList.set(exchange, numberArrayList.get((int)(rate*this.size)));

numberArrayList.set((int)(rate*this.size), current);

}

File dataSet = new File(String.format("dataSet\\%s.txt", this.name));

try {

FileWriter fileWriter = new FileWriter(dataSet);

for(int fileCursor = 0; fileCursor < this.size; fileCursor++) {

fileWriter.write(String.format("%d\n", (int)numberArrayList.get(fileCursor)));

}

fileWriter.close();

} catch (IOException e) {

e.printStackTrace();

}

}

public void setName(int index) {

this.name = Integer.toString(index, 10);

}

public void setSize(int size) {

this.size = size;

}

}

private class SimulationLab extends Thread {

int type;

HashSet drawer;

ArrayList number;

public SimulationLab() {

this.drawer = new HashSet();

this.number = new ArrayList();

}

@Override

public void run() {

switch(this.type) {

case 1:

this.random();

break;

case 2:

this.method();

break;

case 3:

this.group();

break;

default:

break;

}

}

public void readNumber(int index, int rows) throws IOException {

File number = new File(String.format("dataSet\\%d.txt", index));

if(number.exists()) {

FileReader fileReader = new FileReader(number);

BufferedReader bufferedReader = new BufferedReader(fileReader);

String line;

int row=0;

while((line = bufferedReader.readLine()) != null){

this.number.add(Integer.parseInt(line));

row++;

}

if(row != rows) {

throw new IOException("File crashed.");

}

bufferedReader.close();

fileReader.close();

} else {

throw new IOException("File not found.");

}

}

public void setType(int type) {

this.type = type;

}

public void random() {

Random random = new Random();

// System.out.println(this.number.toString());

for(int person = 0; person < this.number.size(); person++) {

boolean notFound = true;

for(int hash = 0; hash < this.number.size(); hash++) {

this.drawer.add(hash);

}

for(int open = 0; open < this.number.size() / 2; open++) {

double rate = random.nextDouble();

while(rate == 1.0) {

rate = random.nextDouble();

}

int position = (int)(this.number.size() * rate);

while(!this.drawer.contains(position)) {

rate = random.nextDouble();

while(rate == 1.0) {

rate = random.nextDouble();

}

position = (int)(this.number.size() * rate);

}

this.drawer.remove(position);

if(position == person) {

notFound = false;

break;

}

}

this.drawer.clear();

if(notFound) {

addResult(person + 1);

return;

}

}

addResult(0);

}

public void method() {

int remaining = this.number.size();

int center = (int)(remaining / 2);

for(int cursor = 0; cursor < this.number.size(); cursor++) {

this.drawer.add(cursor);

}

int start = 0;

while(remaining > center) {

int length = 1;

while(!this.drawer.contains(start)) {

start++;

}

this.drawer.remove(start);

remaining--;

int cursor = (int)this.number.get(start);

while(cursor != start) {

this.drawer.remove(cursor);

cursor = (int)this.number.get(cursor);

length++;

remaining--;

if(length > center) {

addResult(0);

return;

}

}

}

addResult(1);

}

public void group() {

int group0 = (int)(this.number.size() / 2);

int group1 = this.number.size() - group0;

this.method();

}

}

private int size;

private int dataSize;

private int type;

private ArrayList labsArrayList;

volatile private ArrayList dataArrayList;

File result;

private void init(int size, int dataSize, int type) {

this.size = size;

this.dataSize = dataSize;

this.type = type;

this.labsArrayList = new ArrayList();

this.dataArrayList = new ArrayList();

for(int cursor = 0; cursor < size; cursor++) {

DataCreater dataCreater = new DataCreater();

dataCreater.setSize(dataSize);

dataCreater.setName(cursor);

dataCreater.run();

}

}

private void read() {

this.labsArrayList = new ArrayList();

this.dataArrayList = new ArrayList();

}

private void setSize(int size) {

this.size = size;

}

private void setDataSize(int dataSize) {

this.dataSize = dataSize;

}

private void setType(int type) {

this.type = type;

}

private int getSize() {

return this.size;

}

private int getDataSize() {

return this.dataSize;

}

private int getType() {

return this.type;

}

private void randomLab() {

for(SimulationLab simulationLab:this.labsArrayList) {

simulationLab.start();

try {

simulationLab.join();

} catch (Exception e) {

e.printStackTrace();

}

}

}

private void methodLab() {

for(SimulationLab simulationLab:this.labsArrayList) {

simulationLab.start();

try {

simulationLab.join();

} catch (Exception e) {

e.printStackTrace();

}

}

}

private void groupLab() {

for(SimulationLab simulationLab:this.labsArrayList) {

simulationLab.start();

try {

simulationLab.join();

} catch (Exception e) {

e.printStackTrace();

}

}

}

private void start() throws IOException{

for(int cursor = 0; cursor < this.size; cursor++) {

SimulationLab simulationLab = new SimulationLab();

simulationLab.setType(this.getType());

simulationLab.readNumber(cursor, this.dataSize);

this.labsArrayList.add(simulationLab);

}

switch(this.type) {

case 1:

this.randomLab();

break;

case 2:

this.methodLab();

break;

case 3:

this.groupLab();

break;

default:

System.out.println("Wrong Method.");

break;

}

}

private void addResult(int result) {

this.dataArrayList.add(result);

}

private void writeFile() throws IOException {

this.result = new File("Result");

if(!this.result.exists()) {

this.result.mkdir();

}

this.result = new File("Result\\report.txt");

if(!this.result.exists()) {

this.result.createNewFile();

}

BigDecimal bigDecimal = new BigDecimal(0);

if(this.type == 1) {

for (int cursor = 0; cursor < this.dataArrayList.size(); cursor++) {

if((int)this.dataArrayList.get(cursor) == 0) {

bigDecimal = bigDecimal.add(new BigDecimal(1));

}

}

System.out.println(bigDecimal.toString());

bigDecimal = bigDecimal.multiply(new BigDecimal(100));

bigDecimal = bigDecimal.divide(new BigDecimal(this.dataArrayList.size()), 2, RoundingMode.HALF_DOWN);

String rate = String.valueOf(bigDecimal);

FileWriter fileWriter = new FileWriter(this.result, true);

BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);

bufferedWriter.append(String.format("Type: %d, Times: %d, DataSize: %d, Rate: %s %s.\n",

this.type, this.size, this.dataSize, rate, "%"));

bufferedWriter.append(this.dataArrayList.toString());

bufferedWriter.append("\n");

bufferedWriter.close();

fileWriter.close();

} else if(this.type == 2) {

for (int cursor = 0; cursor < this.dataArrayList.size(); cursor++) {

bigDecimal = bigDecimal.add(new BigDecimal((int) this.dataArrayList.get(cursor)));

}

System.out.println(bigDecimal.toString());

bigDecimal = bigDecimal.multiply(new BigDecimal(100));

bigDecimal = bigDecimal.divide(new BigDecimal(this.dataArrayList.size()), 2, RoundingMode.HALF_DOWN);

String rate = String.valueOf(bigDecimal);

FileWriter fileWriter = new FileWriter(this.result, true);

BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);

bufferedWriter.append(String.format("Type: %d, Times: %d, DataSize: %d, Rate: %s %s.\n",

this.type, this.size, this.dataSize, rate, "%"));

bufferedWriter.append(this.dataArrayList.toString());

bufferedWriter.append("\n");

bufferedWriter.close();

fileWriter.close();

} else if(this.type == 3) {

int center = this.dataArrayList.size();

center = center >> 1;

int left = 0;

int right = 0;

int together = 0;

int same = 0;

for(int cursor = 0; cursor < center; cursor++) {

left += (int)this.dataArrayList.get(cursor);

if((int)this.dataArrayList.get(cursor) == (int)this.dataArrayList.get(center + cursor)) {

same++;

if((int)this.dataArrayList.get(cursor) == 1) {

together++;

}

}

}

for(int cursor = center; cursor < this.dataArrayList.size(); cursor++) {

right += (int)this.dataArrayList.get(cursor);

}

// bigDecimal = new BigDecimal(left).divide(new BigDecimal(center), 2, RoundingMode.HALF_DOWN);

// String g0 = bigDecimal.toString();

// bigDecimal = new BigDecimal(right).divide(new BigDecimal(this.dataArrayList.size() - center),

// 2, RoundingMode.HALF_DOWN);

// String g1 = bigDecimal.toString();

// g0 = String.valueOf(Double.parseDouble(g0) * Double.parseDouble(g1) * 100);

// g1 = String.valueOf((100.0 - (Double.parseDouble(g0) / Double.parseDouble(g1))) *

// (1.0 - Double.parseDouble(g1)) + Double.parseDouble(g0));

String g0 = String.valueOf(((double)together * 100 / (double)center));

String g1 = String.valueOf(((double)same * 100 / (double)center));

bigDecimal = new BigDecimal(left + right);

bigDecimal = bigDecimal.multiply(new BigDecimal(100));

bigDecimal = bigDecimal.divide(new BigDecimal(this.dataArrayList.size()), 2, RoundingMode.HALF_DOWN);

String rate = String.valueOf(bigDecimal);

FileWriter fileWriter = new FileWriter(this.result, true);

BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);

bufferedWriter.append(String.format("Type: %d, Times: %d, DataSize: %d, Rate: %s %s, %s%s %s%s.\n",

this.type, this.size, this.dataSize, rate, "%", g0, "%", g1, "%"));

bufferedWriter.append(this.dataArrayList.toString());

bufferedWriter.append("\n");

bufferedWriter.close();

fileWriter.close();

}

}

private void printResult() {

BigDecimal bigDecimal = new BigDecimal(0);

if(this.type == 1) {

for (int cursor = 0; cursor < this.dataArrayList.size(); cursor++) {

if((int)this.dataArrayList.get(cursor) == 0) {

bigDecimal = bigDecimal.add(new BigDecimal(1));

}

}

}

else {

for (int cursor = 0; cursor < this.dataArrayList.size(); cursor++) {

bigDecimal = bigDecimal.add(new BigDecimal((int) this.dataArrayList.get(cursor)));

}

}

bigDecimal = bigDecimal.multiply(new BigDecimal(100));

bigDecimal = bigDecimal.divide(new BigDecimal(this.dataArrayList.size()), 2, RoundingMode.HALF_DOWN);

String rate = String.valueOf(bigDecimal);

System.out.println(String.format("The rate is %s percent.", rate));

}

}

一键复制

编辑

Web IDE

原始数据

按行查看

历史

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值