2015-12-07 43 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)並且集合將被排序。

這應該允許在程序中更容易遵循的代碼以及更少的混亂。