我有一个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
,州接收所有城市。
答案 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<>();
// ...