我正在尝试制作一个概率结果模拟器,其中信息来自于一个.csv文件。创建了两个ArrayList,然后将信息和结果放入这些ArrayList中。Double ArrayList包含String ArrayList中每个相应的两个团队的置信度评级。
Example:
Double ArrayList: 25, 22, 50
String ArrayList: Atlanta, Michigan, NY, Detroit
Atlanta and Michigan would correspond to 25, NY and Detroit would correspond to 22.
我已经编写了程序,置信度评分双倍的ArrayList被排序了,但是球队名称的String ArrayList没有被排序。 这是它们在排序之前的两个ArrayList:
[1.0, 7.0, 8.0, 1.0, 10.0, 2.0, 4.0, 3.0, 1.0, 1.0, 9.0, 1.0, 3.0, 6.0, 0.0, 16.0]
[Green Bay, [Detroit, NY Jets, [NY Giants, [St. Louis, Arizona, [Tampa Bay, Atlanta, [Minnesota, Seattle, Houston, [Buffalo, [Miami, Baltimore, Cincinnati, [Cleveland, Jacksonville, [Tennessee, SF, [Chicago, Denver, [San Diego, KC, [Oakland, Carolina, [New Orleans, [New England, Philly, [Pittsburgh, Indy, [Washington, Dallas]
在这两个列表排序后,它们看起来是这样的:
[16.0, 10.0, 9.0, 8.0, 7.0, 6.0, 4.0, 3.0, 3.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0]
[[NY Giants, [Cleveland, Jacksonville, Seattle, [Cleveland, [St. Louis, Houston, Arizona, [Buffalo, [NY Giants, [Cleveland, [Cleveland, Baltimore, [Miami, Atlanta, [NY Giants, Atlanta, [Tennessee, SF, [Chicago, Denver, [San Diego, KC, [Oakland, Carolina, [New Orleans, [New England, Philly, [Pittsburgh, Indy, [Washington, Dallas]
置信度评分按降序成功排序了,但是团队与其相应的得分不对应。实际上,同一个团队被复制了多次。我该如何解决这个问题并让所有团队对应他们适当的评分?(sortArrays()方法是排序操作发生的地方)。
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.scene.layout.*;
import javafx.scene.control.*;
import javafx.stage.FileChooser;
import javafx.geometry.*;
import java.util.*;
import java.io.*;
public class POS extends Application
{
private ArrayList<Double> confidenceList = new ArrayList<>();
private ArrayList<String> cityList = new ArrayList<>();
private BorderPane pane = new BorderPane();
private Button runBtn = new Button("Run");
@Override
public void start(Stage stage)
{
VBox vBox = new VBox(20);
vBox.setPadding(new Insets(15));
Button selectBtn = new Button("Select File");
selectBtn.setStyle("-fx-font: 22 arial; -fx-base: #b6e7c9;");
vBox.getChildren().add(selectBtn);
selectBtn.setOnAction(e->
{
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Open Resource File");
FileChooser.ExtensionFilter extFilter =
new FileChooser.ExtensionFilter("TEXT files (*.csv)", "*.CSV", ".xlsv", ".XLSV");
fileChooser.getExtensionFilters().add(extFilter);
File file = fileChooser.showOpenDialog(stage);
run(file);
});
RadioButton weekBtn = new RadioButton("Current Week");
RadioButton seasonBtn = new RadioButton("Entire Season");
runBtn.setStyle("-fx-font: 22 arial; -fx-base: #b6e7c9;");
weekBtn.setSelected(true);
seasonBtn.setDisable(true);
vBox.getChildren().add(weekBtn);
vBox.getChildren().add(seasonBtn);
vBox.getChildren().add(runBtn);
pane.setLeft(vBox);
Scene scene = new Scene(pane, 500, 200);
stage.setScene(scene);
stage.setTitle("POS");
stage.show();
}
public void run(File file)
{
runBtn.setOnAction(e->
{
try
{
Scanner input = new Scanner(file);
input.nextLine();
sortFile(file, input);
input.close();
}
catch (InputMismatchException ex)
{
System.out.println("Error you seem to have typed the wrong type of file");
}
catch(IOException ex)
{
System.out.println("Error, file could not be found");
}
});
}
public void sortFile(File file, Scanner input)
{
if (!input.hasNext())
{
sortArrays(confidenceList, cityList);
}
else
{
String strList = Arrays.toString(input.nextLine().split("\t"));
String[] arrList = strList.split(",");
int homeRank = Integer.parseInt(arrList[1]);
int roadRank = Integer.parseInt(arrList[6]);
Random r = new Random();
int lowestTeamRank = Math.abs(homeRank - roadRank);
double numForHomeTeam = 0;
double numForRoadTeam = 0;
if (homeRank < roadRank)
{
numForHomeTeam = ((r.nextInt(lowestTeamRank) - r.nextInt(2)) + (getLastGameOutcome(arrList[4])* r.nextInt(3))) - getWinPct(arrList[2], arrList[3]);
numForRoadTeam = ((r.nextInt(roadRank) + r.nextInt(2)) + (getLastGameOutcome(arrList[9])* r.nextInt(3))) - getWinPct(arrList[7], arrList[8]);
}
else if (homeRank > roadRank)
{
numForHomeTeam = ((r.nextInt(homeRank) - r.nextInt(2)) + (getLastGameOutcome(arrList[4])* r.nextInt(3))) - getWinPct(arrList[2], arrList[3]);
numForRoadTeam = r.nextInt(lowestTeamRank) - r.nextInt(2) + getLastGameOutcome(arrList[9])* r.nextInt(3) - getWinPct(arrList[7], arrList[8]);
}
double confidenceRate = Math.round(Math.abs(numForHomeTeam - numForRoadTeam));
confidenceList.add(confidenceRate);
if (numForHomeTeam < numForRoadTeam)
{
cityList.add(arrList[0]);
cityList.add(arrList[5]);
}
else if (numForHomeTeam > numForRoadTeam)
{
cityList.add(arrList[5]);
cityList.add(arrList[0]);
}
else
{
cityList.add(arrList[0]);
cityList.add(arrList[5]);
}
sortFile(file, input);
}
}
public int getLastGameOutcome(String lastGame)
{
if (lastGame.charAt(0) == 'W')
{
return (int)(Math.random() * 3);
}
else
{
return (int)(Math.random() * -3);
}
}
public double getWinPct(String wins, String losses)
{
double newWins = Double.parseDouble(wins);
double newLosses = Double.parseDouble(losses);
return newWins / (newWins + newLosses);
}
public void sortArrays(ArrayList<Double> doubleArray, ArrayList<String> stringArray)
{
System.out.println(doubleArray);
System.out.println(stringArray);
for (int i = 0; i < doubleArray.size(); i++)
{
for (int j = 0; j < doubleArray.size(); j++)
{
if (doubleArray.get(j).compareTo(doubleArray.get(i)) < 1)
{
double tempDouble = doubleArray.get(j);
doubleArray.set(j, doubleArray.get(i));
doubleArray.set(i, tempDouble);
String tempString = stringArray.get(j);
String tempString2 = stringArray.get(j + 1);
stringArray.set(j, stringArray.get(i));
stringArray.set(j + 1, stringArray.get(i + 1));
stringArray.set(i, tempString);
stringArray.set(i + 1, tempString2);
}
}
}
System.out.println(doubleArray);
System.out.println(stringArray);
}
}
compareTo
方法中将return
语句修改为-1 * Double.compare( confidence, other.confidence )
。(或者可以交换参数位置,但不要同时进行两种操作。)然后当你使用Collection.sort
时,它会按照你期望的顺序排序。 - Roddy of the Frozen Peas