如果...则在加载.sav文件后比较器失败

时间:2012-01-23 06:14:42

标签: java if-statement multidimensional-array comparator

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

MAIN:

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;
    }

}

1 个答案:

答案 0 :(得分:2)

您正在通过引用来比较字符串,而不是语义相等。这样:

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

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