【问题标题】:How to load a text file, add it to an array and change it into an object?如何加载文本文件,将其添加到数组并将其更改为对象?
【发布时间】:2019-12-02 11:54:59
【问题描述】:

我正在创建一个程序来显示保存在文本文件中的餐厅评论。如图所示,文本文件是通过 DAOimpl 类读入的。

public class DAOlmpl implements DAOInterface {
    static final char DELIMITER=',';   

    /**@Override*/
    public Repository load(String filename) {

        Repository repository = new Repository();

        try (BufferedReader br = new BufferedReader(new FileReader(filename))) { 
            String[] temp;
            String line = br.readLine();
            while(line!=null){
                temp=line.split(Character.toString(DELIMITER));        
                String name = stripQuotes(temp[0]);
                String location = stripQuotes(temp[1]);
                Restaurant restaurant = new Restaurant(name, location) {};
                int lines = Integer.parseInt(temp[2]);
                ArrayList<Review> review = new ArrayList<>();

                for (int i=0; i<lines; i++) {
                    restaurant.addReviews(review);
                }
                repository.add(restaurant);                
                line = br.readLine();                
            }
            br.close();
        } catch (IOException ex) {
            Logger.getLogger(DAOlmpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return repository;
    }
}

然后使用此方法转移到 Restaurant 类。

public void addReviews(Review review) {
    this.reviewsCollection.add(review);
}

但是,我似乎无法将它作为数组列表而不是对象的形式放入 Restruant 类。我已经尝试了很多方法来纠正它,但无法让它正常工作

【问题讨论】:

  • 你问题的最后一部分不清楚。请让问题更清楚。你想达到什么目标?
  • 我不确定我是否理解评论解析应该如何工作,似乎缺少某些东西:至少构造至少一个评论对象。您只需创建 ArrayList 来存储评论,但您没有放任何东西。复习课是什么样子的???但是当前问题的解决方案可以直接从您问题的最后一句得出:您要么需要更改addReviews 的签名(可能还有实现)以接受ArrayList,要么您需要更改review变量是并实例化它 e. G。作为Review review = new Review(...)

标签: java arrays netbeans text-files dao


【解决方案1】:

如果我没看错,这可能是解决方案:

List<Review> reviews = new ArrayList<>();

for (Review review : reviews) {
   restaurant.addReview(review);
}

对于函数

public void addReview(Review review) {
   this.reviewsCollection.add(review);
}

因此,您将每条评论分别添加到列表中。

但是您没有将任何 Review 对象放入您的列表中,因此在此示例中您的列表将为空。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    您的代码中缺少某些逻辑。我注意到您没有创建任何 Review 对象。为了解决这个问题,您可以一个接一个地创建 Review 对象,并为每个创建的 Review 对象调用 Restaurant.addReviews(Review); 方法。这可以在 for 循环中完成,如下所示:

            for (int i=0; i<lines; i++) {
    
                // Create a review object
                //
                Review review = createReview();
    
                // Add the review object
                //
                restaurant.addReviews(review);
            }
    

    以上将消除对评论的 ArrayList 的需要。

    另外,添加评论的方法如下...

    public void addReviews(Review review) {
        this.reviewsCollection.add(review);
    }
    

    ...可以分为两种方法。一种方法名为:addReview 添加单个评论,另一种方法名为:addReviews 添加许多评论。请注意前者缺少字母“s”,并添加到后者的方法名称中。使用“s”表示添加多个...请参阅以下两种方法:

    public void addReviews(List<Review> reviews) {
        this.reviewsCollection.addAll(reviews);
    }
    
    public void addReview(Review review) {
        this.reviewsCollection.add(review);
    }
    
    

    还有更多的观察。但我只是回答了紧迫的问题(即你的问题)。

    现在,让我们把它们放在一起:

    public class DAOlmpl implements DAOInterface {
    
        static final char DELIMITER=',';   
    
        /**@Override*/
        @Override
        public Repository load(String filename) {
    
            Repository repository = new Repository();
    
            try (BufferedReader br = new BufferedReader(new FileReader(filename))) { 
    
                String line = br.readLine();
    
                while(line!=null){
    
                    Restaurant restaurant = createRestaurantHavingReviews(line)
    
                    repository.add(restaurant);                
    
                    line = br.readLine();                
                }
    
                br.close();
    
            } catch (IOException ex) {
                Logger.getLogger(DAOlmpl.class.getName()).log(Level.SEVERE, null, ex);
            }
    
            return repository;
        }
    
        public Restaurant createRestaurantHavingReviews(String line) {
    
            String [] temp=line.split(Character.toString(DELIMITER));        
    
            Restaurant restaurant = createRestaurant(temp);
    
            int lines = Integer.parseInt(temp[2]);
    
            for (int i=0; i<lines; i++) {
    
                Review review = createReview(temp);
    
                restaurant.addReview(review);
            }
    
            return restaurant;            
        }
    
        public Restaurant createRestaurant(String[]temp) {
            String name = stripQuotes(temp[0]);
            String location = stripQuotes(temp[1]);
            Restaurant restaurant = new Restaurant(name, location) {};
            return restaurant;
        }
    
        public Review createReview(String[]temp) {
            throw new UnsupportedOperationException("Please implement me!");
        }
    }
    

    上面的代码更具可读性,如果你实现 public Review createReview(String[]temp) 上面的方法..如果你有更多问题,我们可以从那里开始。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      • 2022-12-07
      • 2022-01-07
      • 1970-01-01
      • 2023-04-01
      • 2017-03-04
      相关资源
      最近更新 更多