【问题标题】:If...then comparator fails after loading .sav file如果...然后比较器在加载 .sav 文件后失败
【发布时间】:2012-02-16 13:52:26
【问题描述】:

我最近重新开始编程,并决定学习 Java 作为我的第一门主要语言。在我开始研究文件保存之前,我已经走了很远,没有任何重大问题。我几乎采用了我遇到的第一种方法。输入和输出流。我遇到的问题出在“analyzeIncidents”方法中。如果不存在用户数据,则该方法运行正常,我得到预期的输出。如果用户数据确实存在,那么“analyzeIncidents”中的第一个 if...then 语句将运行,但它永远不会发现条件语句为真。但是,一旦我删除了 UserData.sav 文件,一切都会恢复正常。我花了几个小时检查程序所有阶段的输出,但到目前为止,我找不到 if...then 语句在使用加载的数据时失败但否则成功的原因。我也尝试在数据被扔到“analyzeIncidents”之前保存然后加载数据,它在第一次运行时工作,但在之后的任何尝试都失败。希望你们能指出我确信是我的一个明显错误。

主要:

import java.io.*;
import java.util.*;


public class nutralyzeApp {


    static Scanner userInput = new Scanner(System.in);

    public static void main(String[] args) {

        int elements = 0;
        int selectedElement = 0;
        int[][] incidentAnalysis = new int[2][50];
        String newElement = "999";
        String[][] data2012 = new String[366][51];


        //Checks to see if previous save file exists. If not, creates new save file.
        File f = new File("C:/Users/Liam/Dropbox/Workspace/Nutralyze/UserData.sav");
        if(f.exists()) {
            System.out.println("Previous work session loaded.");
            data2012 = loadData();
        } else {
            data2012[0][0] = "granola";
            data2012[0][1] = "gluten";
            data2012[0][2] = "sugar";
            data2012[0][3] = "beef";
            data2012[1][0] = "dairy";
            data2012[8][0] = "cheese";
            data2012[59][0] = "pizza";
            data2012[59][1] = "chips";
            data2012[206][0] = "beer";
            data2012[206][1] = "cheese";

            data2012[8][50] = "incident";
            data2012[59][50] = "incident";
            data2012[85][50] = "incident";
            data2012[190][50] = "incident";
            data2012[206][50] = "incident";

            saveData(data2012);
        }

        System.out.println("What day is it? ");
        int currentDay = userInput.nextInt();
        elements = numberOfElements(currentDay,data2012);

        System.out.println("Elements consumed that day: " + elements);

        System.out.println("What element would you like to add?");
        newElement = userInput.next();

        while (!newElement.equals("49")) {
            data2012 = addElement(currentDay,elements,newElement,data2012);
            elements = numberOfElements(currentDay,data2012);
            System.out.println("What element would you like to add?");
            newElement = userInput.next();
        }

        System.out.print("Which element would you like to see? ");
        selectedElement = userInput.nextInt();

        while (selectedElement != 49) {
            System.out.println("The element you selected is: " + data2012[currentDay][selectedElement]);
            System.out.println("You typed: " + selectedElement);
            System.out.print("Which element would you like to see? ");
            selectedElement = userInput.nextInt();
        }

        data2012 = gatherElements(data2012);
        incidentAnalysis = analyzeIncidents(data2012);  

        for (int x=0;x<10;x++) {
            System.out.print(data2012[365][x] + " --> " + incidentAnalysis[0][x] + "/" + incidentAnalysis[1][x]+ "\n");
        }

        //Resets data and saves to file.
        for (int x=0;x<50;x++) {
            data2012[365][x] = null;
        }   

        saveData(data2012); 
    }

方法:

    private static int[][] analyzeIncidents(String[][] userData) {

        boolean found = false;
        int elements1 = 0;
        int elements2 = 0;
        int incidentCounter = 0;
        int currentIncident = 0;
        int[] incidentDates = new int[365];
        int[][] incidentReport = new int[2][50];

        for (int x=0;x<365;x++) {
            if (userData[x][50]=="incident") {
                incidentDates[incidentCounter]=x;
                incidentCounter++;
                System.out.println(userData[x][50]);
            } 
        }
System.out.println(incidentCounter + "          " + userData[8][50]);
        elements1 = numberOfElements(365,userData);
        for (int x=0;x<elements1;x++) {

            for (int y=0;y<incidentCounter;y++) {

                currentIncident = incidentDates[y];
                elements2 = numberOfElements(currentIncident,userData);

                for (int z=0;z<elements2;z++) {
                    if ((userData[365][x]==userData[currentIncident][z]) && (found==false)) {
                        incidentReport[0][x]++;
                        incidentReport[1][x]++;
                    } else if ((userData[365][x]==userData[currentIncident][z]) && (found==true)) {
                        incidentReport[1][x]++;
                    }
                }


            }
        }

        return incidentReport;
    }

    private static String[][] gatherElements(String[][] userData) {

        int z = 0;
        int elements = 0;
        int uniqueElements = 0;
        boolean found = false;

        for (int x=0;x<50;x++) {
            userData[365][x] = null;
        }
        //userData[365][0] = userData[0][0];

        for (int x=0;x<365;x++) {
            elements = numberOfElements(x,userData);

            for (int y=0;y<elements;y++) {
                while (z<50) {
                    if (userData[365][z]!=userData[x][y]) {
                        z++;
                        found=false;
                    } else if (userData[365][z]==userData[x][y]) {
                        z=50;
                        found=true;
                        break;
                    }
                }
                z=0;

                if (found==false) {
                    userData[365][uniqueElements] = userData[x][y];
                    uniqueElements++;
                }
            }
        }
        return userData;
    }

    private static String[][] addElement(int day,int position,String newElement,String[][] userData) {

        userData[day][position] = newElement;
        return userData;
    }

    private static int numberOfElements(int day, String[][] userData) {

        int x = 0;

        while (userData[day][x] != null && x < 365) {
            x++;
        }
        return x;
    }

    private static void saveData(String[][] data2012) {

        try{
            // Open a file to write to, named UserData.sav
            FileOutputStream saveFile = new FileOutputStream("UserData.sav");
            // Create an ObjectOutputStream to put objects into save file
            ObjectOutputStream save = new ObjectOutputStream(saveFile);
            // Now we do the save
            save.writeObject(data2012);
            // Close the file
            save.close(); // This also closes saveFile  
        }
        catch(Exception exc){
        exc.printStackTrace(); // If there was an error, print the info
        }
    }

    private static String[][] loadData() {

        String[][] userData = new String[366][51];

        try{
           // Open file to read from, named UserData.sav
           FileInputStream saveFile = new FileInputStream("UserData.sav");

           // Create an ObjectInputStream to get objects from save file
           ObjectInputStream save = new ObjectInputStream(saveFile);

           // Now we do the restore
           // readObject() returns a generic Object, we cast those back
           // into their original class type
           // For primitive types, use the corresponding reference class

           userData = (String[][]) save.readObject();

           // Close the file
           save.close(); // This also closes saveFile
        }
        catch(Exception exc){
        exc.printStackTrace(); // If there was an error, print the info
        }
              return userData;
    }

}

【问题讨论】:

    标签: java if-statement multidimensional-array comparator


    【解决方案1】:

    您是通过引用来比较字符串,而不是为了语义相等。这个:

    if (userData[x][50]=="incident")
    

    应该是:

    if (userData[x][50].equals("incident"))
    

    或者如果你想继续,即使userData[x][50] 为空:

    if ("incident".equals(userData[x][50]))
    

    你在其他地方也这样做:

    if (userData[365][z]!=userData[x][y]) {
    ...
    } else if (userData[365][z]==userData[x][y]) {
    }
    

    这应该是:

    if (!userData[365][z].equals(userData[x][y])) {
    ...
    } else {
    }
    

    (您不需要第二个条件,因为它与第一个完全相反。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多