2015-12-07 41 views
3

我正在创建一个概率结果模拟器,其中信息是从.csv文件输入的。该文件包含两个团队,他们的损失,胜利,等级和以前的游戏结果。最后,将它们的“置信度”等级放入一个ArrayList中,并将这两个团队放入另一个ArrayList中(取决于谁将该团队首先放入ArrayList)。所以每个相应的两支球队都有一个信心得分。这里是我到目前为止的代码:我怎么想这恰恰是像使用双列表排序相应的字符串列表

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) 
    { 


    } 

} 

例子:

ArrayList with confidence ranks: 2, 50, 20, 30, etc. 
ArrayList with teams: Chicago, Detroit, Atlanta, NY, etc. 

芝加哥和底特律将对应于2,亚特兰大和纽约州将对应于50分选后,它应该看起来像这样:

50, 30, 20, 2 
Atlanta, NY...... 

我该如何实现它?

+1

难道你不能用字符串值'name'创建一个'City'类,并且使用double值'rank'并将这个类的实例存储到'List'中? – SomeJavaGuy

回答

2

推荐的方法是做什么@Kevin Esche建议和建立一个代表您的实体的对象。

在这种情况下,您将有一个Team对象,其属性在CSV文件中表示。然后,您将使您的Team对象实现Comparable接口。

此接口的目的是为您提供可以对Team对象集合进行排序的方法。一旦你做到了这一点,你所需要做的就是做Collections.sort(myTeamCollection)并且集合将被排序。

这应该允许在程序中更容易遵循的代码以及更少的混乱。