首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组未正确更新为“显示数组”类对象的数组在另一个类中初始化。

数组未正确更新为“显示数组”类对象的数组在另一个类中初始化。
EN

Stack Overflow用户
提问于 2019-09-11 13:16:53
回答 2查看 56关注 0票数 0

我有一个名为cartList.txt的平面文件,还有两个名称为GetCachedCartList.javaAddToShoppingList.java的类。

我使用类GetCachedCartList.java从平面文件中获取数字(这是产品的in (我正在处理购物车的一个项目),这些数字以表单num1#num2#num3#等形式写入文件中,这些数字被存储到该类的int数组变量中。

正如您所看到的,我使用了'#‘作为分隔符来区分不同的数字。

我使用类AddToShoppingList.java将文本"num#"添加到平面文件中的现有文本中。

当我尝试测试这两个类时,当GetCachedCartList.java在它自己的main方法中正确地输出cartList.txt中的数字时,问题就出现了,但是当我使用在AddToShoppingList.java的主方法中初始化的对象时,在添加了像"num#"这样的文本后,它给出了非常出乎意料的results.The数字num,似乎已经在帮助数组中添加了很多次,而不仅仅是一次,文本"num#"也被添加到平面文件的文本中,超过一次,但比数组中的文本少。

我怀疑这可能是由于不正确地使用循环,但无法发现任何错误。

cartList.txt

2#3#

GetCachedCartList.java

代码语言:javascript
复制
package Resources.utils.queries;

/**
 *
 * @author Aditya
 */

import java.io.File;
import java.util.Scanner;
import java.util.ArrayList;

public class GetCachedCartList {
    private static ArrayList<String> StringcartProdIdList = new ArrayList<String>();
    private static int[] cartProdIdList;

    public GetCachedCartList(){
        try{
            File cartListFile = new File("src/SessionData/productCachedData/cartList.txt");
            Scanner scann = new Scanner(cartListFile);
            scann.useDelimiter("#");
            while(scann.hasNext()){
                String s = scann.next();
                StringcartProdIdList.add(s); 
            }
            scann.close();

            cartProdIdList = new int[StringcartProdIdList.size()];
            for(int i = 0; i < StringcartProdIdList.size(); i++){
                cartProdIdList[i] = Integer.parseInt(StringcartProdIdList.get(i));
            }
        }
        catch (Exception ex) {
            System.out.println("Error:"+ex.getMessage());
        }
    }

    /**
     * @return the IDs of Items added in the Shopping Cart
     */
    public static int[] getCartProdIdList() {
        return cartProdIdList;
    }

    public static void main(String[] args){
        GetCachedCartList g = new GetCachedCartList();
        System.out.println("Length: "+g.getCartProdIdList().length);
        for(int i: g.getCartProdIdList()){
            System.out.println(i);
        }
    }
}

AddToShoppingList.java

代码语言:javascript
复制
package Resources.utils.queries;

/**
 *
 * @author Aditya
 */

import java.io.File;
import java.util.Scanner;
import java.io.PrintWriter;
import Resources.utils.queries.GetCachedCartList;

public class AddToShoppingList {
    public AddToShoppingList(int pid){
        try{
            GetCachedCartList gCCl = new GetCachedCartList();
            int[] initialCartListArr = gCCl.getCartProdIdList();
            String initialCartList = "";
            for(int i = 0; i < initialCartListArr.length; i++){
                initialCartList += initialCartListArr[i] + "#";
            }
            File cartListFile = new File("src/SessionData/productCachedData/cartList.txt");
            PrintWriter writer = new PrintWriter(cartListFile);
            writer.print("");
            writer.write(initialCartList);
            writer.write(pid+"#");
            writer.close();

        }
        catch(Exception e){
            System.out.println("Error:"+e.getMessage());
        }
    }

    public static void main(String[] args){
        GetCachedCartList gCCl1 = new GetCachedCartList();
        int[] initialCartListArr = gCCl1.getCartProdIdList();
        System.out.println("Initial cart list");
        for(int i = 0; i < initialCartListArr.length; i++){
            System.out.println(initialCartListArr.length+" : "+initialCartListArr[i]);
        }

        AddToShoppingList aTSL = new AddToShoppingList(9);

        System.out.println("Updated cart list");

        GetCachedCartList gCCl2 = new GetCachedCartList();
        int[] finalCartListArr = gCCl2.getCartProdIdList();
        for(int i = 0; i < finalCartListArr.length; i++){
            System.out.println(finalCartListArr.length+" : "+finalCartListArr[i]);
        }
    }
}

如果您首先运行GetCachedCartList.java,然后运行AddToShoppingList.java,则输出上述代码为:

GetCachedCartList.java

代码语言:javascript
复制
Length: 2
2
3

AddToShoppingList.java

代码语言:javascript
复制
Initial cart list
2 : 2
2 : 3
Updated cart list
9 : 2
9 : 3
9 : 2
9 : 3
9 : 2
9 : 3
9 : 2
9 : 3
9 : 9

现在平面文件有了文本

代码语言:javascript
复制
2#3#2#3#9#

哪里发生错误了?谢谢~

EN

回答 2

Stack Overflow用户

发布于 2019-09-11 13:47:56

我希望我能正确地理解你对申请的想法。抱歉如果没有。因为String s = scann.next();返回"2, 3, \n“,所以有0,因为

代码语言:javascript
复制
AddToShoppingList.main {
    ...
    GetCachedCartList gCCl1 = new GetCachedCartList();
    ...
    GetCachedCartList gCCl2 = new GetCachedCartList();
}

我建议流动的代码:

输出

代码语言:javascript
复制
Error:null
Initial cart list
2 : 2
2 : 3
Error:null
Updated cart list
4 : 2
4 : 3
4 : 2
4 : 3

代码语言:javascript
复制
public class AddToShoppingList {
    public AddToShoppingList(int pid) {
        try {
            GetCachedCartList gCCl = new GetCachedCartList();
            List<Integer> initialCartListArr = gCCl.getCartProdIdList();
            String initialCartList = "";
            for (int i = 0; i < initialCartListArr.size(); i++) {
                initialCartList += initialCartListArr.get(i) + "#";
            }
            File cartListFile = new File("/home/ibondarenko/projects/demo/src/main/resources/cartList.txt");
            PrintWriter writer = new PrintWriter(cartListFile);
            writer.print("");
            writer.write(initialCartList);
            writer.write(pid + "#");
            writer.close();

        } catch (Exception e) {
            System.out.println("Error:" + e.getMessage());
        }
    }

    public static void main(String[] args) {
        GetCachedCartList gCCl1 = new GetCachedCartList();
        List<Integer> initialCartListArr = gCCl1.getCartProdIdList();
        System.out.println("Initial cart list");
        for (int i = 0; i < initialCartListArr.size(); i++) {
            System.out.println(initialCartListArr.size() + " : " + initialCartListArr.get(i));
        }

        AddToShoppingList aTSL = new AddToShoppingList(9);

        System.out.println("Updated cart list");

//        GetCachedCartList gCCl2 = new GetCachedCartList();
        List<Integer> finalCartListArr = gCCl1.getCartProdIdList();
        for (int i = 0; i < finalCartListArr.size(); i++) {
            System.out.println(finalCartListArr.size() + " : " + finalCartListArr.get(i));
        }
    }
}


public class GetCachedCartList {
    private static ArrayList<Integer> StringcartProdIdList = new ArrayList<Integer>();

    public GetCachedCartList() {
        try {
            File cartListFile = new File("/home/ibondarenko/projects/demo/src/main/resources/cartList.txt");
            Scanner scann = new Scanner(cartListFile);
            scann.useDelimiter("#");
            while (scann.hasNext()) {
                int s = scann.nextInt();
                StringcartProdIdList.add(s);
            }
            scann.close();
        } catch (Exception ex) {
            System.out.println("Error:" + ex.getMessage());
        }
    }

    /**
     * @return the IDs of Items added in the Shopping Cart
     */
    public static ArrayList<Integer> getCartProdIdList() {
        return StringcartProdIdList;
    }

    public static void main(String[] args) {
        GetCachedCartList g = new GetCachedCartList();
        System.out.println("Length: " + StringcartProdIdList.size());
        for (int i : g.getCartProdIdList()) {
            System.out.println(i);
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2019-09-11 13:49:01

我认为您可以首先简化代码:

一个具有从文件中读取ids并检索List<Integer>的逻辑的类

代码语言:javascript
复制
public final class ReadCartProdIds {

    private final File file;

    public ReadCartProdIds(File file) {
        this.file = file;
    }

    public List<Integer> apply() throws FileNotFoundException {
        try (Scanner scan = new Scanner(file)) {
            scan.useDelimiter("#");

            List<Integer> cartProdIds = new ArrayList<>();

            while (scan.hasNext()) {
                cartProdIds.add(scan.nextInt());
            }

            return cartProdIds.isEmpty() ? Collections.emptyList() : Collections.unmodifiableList(cartProdIds);
        }
    }
}

另一个要添加到此文件中的新pid (您甚至不必重新读取已存在的文件,只需向其添加新文本):

代码语言:javascript
复制
public final class AddCarProdId {

    private final File file;

    public AddCarProdId(File file) {
        this.file = file;
    }

    public void apply(int pid) throws IOException {
        Files.write(file.toPath(), (pid + "#").getBytes(), StandardOpenOption.APPEND);
    }

}

最后,您的main程序可以如下所示:

代码语言:javascript
复制
public static void main(String[] args) throws IOException {
    File file = new File("d:/cartList.txt");
    printFile(file, "Initial cart list:");
    new AddCarProdId(file).apply(9);
    printFile(file, "Updated cart list");
}

private static void printFile(File file, String message) throws FileNotFoundException {
    System.out.println(message);

    List<Integer> cartProdIds = new ReadCartProdIds(file).apply();
    cartProdIds.forEach(cartProdId -> System.out.println(cartProdIds.size() + " : " + cartProdId));
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57890112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档