用CSV文件返回错误填充对象

时间:2019-04-07 16:44:30

标签: java servlets

我有一个CSV文件,其中包含以下信息:

 <script>
   $('#reg').on('submit', function(e) {

     $.ajax({
       url:'script/register.php',
       data: $(this).serialize(), 
       type:'POST',
       success:function(results) {
          $(".result").html(results);
       }
    });
   return false;
  });

每行的每个第一数据都是一个州,其次是该州的城市。

我有两个对象,州和城市,州(埃斯塔多)具有名称和一个Santa Catarina,Florianópolis,São José,Biguaçu,Palhoça Rio grande do Sul,Porto alegre,,, Paraná,Curitiba,Londrina,Ponta Grossa, 个城市,而市(Cidade)具有许多属性。

要阅读我的CSV,这是我的代码:

ArrayList

问题是我不能将城市限制在各自的州。

我正在测试使用BufferedReader r = new BufferedReader(new FileReader("C:\\Users\\Pedro Sarkis\\Desktop\\ex3.csv")); ArrayList<Estado> estados = new ArrayList<>(); ArrayList<Cidade> cidade = new ArrayList<>(); // String estados2[]; int i = 1; String line = r.readLine(); try { while (line != null) { // System.out.println("Line " + i + ": " + line); String[] campos = line.split(","); for (int j = 1; j < campos.length; j++) { Cidade c = new Cidade(); c.setNome(campos[j]); cidade.add(c); } Estado e = new Estado(campos[0], cidade); estados.add(e); cidade.clear(); line = r.readLine(); i++; } } finally { r.close(); } 在每个.clear()之后重新设置我的列表,但是它不起作用,因为它重置了我所有的过去数据,并且没有使用while,州接收所有城市。

2 个答案:

答案 0 :(得分:0)

在这种情况下,不能使用clear(),因为列表中的先前元素仍然指向同一对象。因此,它也将更改先前元素的值。更改您的代码

cidade.clear();

cidade = new ArrayList<>();

答案 1 :(得分:0)

每个Estado实例都需要一个全新列表。如果将相同的List对象传递给每个Estado结构,则它们都共享同一个List对象。调用clear()不会创建新的或不同的List对象,而只是从同一List对象中删除元素。

有两种方法可以完成此操作。

第一种方法:您可以将Estado类更改为使用一种称为防御性复制的面向对象的实践。 Estado类将复制提供给其构造函数的List参数,因此其他代码将无法执行通过更改列表来更改Estado实例。这样,只有Estado的调用方法才能更改Estado实例。这使我们可以说Estado类通过对其状态进行排他控制来封装数据。

public class Estado {
    private String state;

    private List<String> cities;

    public Estado(String state,
                  List<String> cities) {

        this.state = state;

        // Copying the List, so any later modifications cannot affect
        // this instance.
        this.cities = new ArrayList<>(cities);
    }
}

第二种方法:为您阅读的每一行创建一个新的城市ArrayList。

while (line != null) {

    String[] campos = line.split(","); 

    cidade = new ArrayList<>();

    // ...