我正在尝试添加 ArrayList 对象,其中构造函数有3个参数(int,int,hashset)。当我添加一个新对象时,hashset中的值会以某种方式发生变化,因此我添加了错误的值。例如,我创建3个对象,添加这3组整数:
142082 74016 122517 57432 97112
142082 150224 112373 129671 57432 97112 138427 115659 102283 147774
142082 31491 129671 855 57432 73545 123160 124682 147774 61966 58590
但是对象收到了这些:
70213 131022 118104 137949 4003 13798 23598 129525
70213 131022 118104 137949 4003 13798 23598 129525
70213 131022 118104 137949 4003 13798 23598 129525
我无法理解为什么集合会改变它的价值。这是功能代码:
//Array of ParagData objects
public static ArrayList<ParagData> getAllParagsDatas(String indexed_data_tab) throws SQLException{
ArrayList<IndexedItem> allIndexedItems = new ArrayList<>();
ArrayList<ParagData> allParags = new ArrayList<>();
HashSet<Integer> wordsId = new HashSet<>();
//Array of all indexed words
allIndexedItems = GuiFindFrags.myConnection.getAllIndexedItems(indexed_data_tab);
int curCycledParag = 1; //current paragraph num
int curCycledTextId = 1; //current text id
for(int i = 0; i < allIndexedItems.size(); i++){
if((allIndexedItems.get(i).textId == curCycledTextId) && allIndexedItems.get(i).paragNum == curCycledParag){
if(allIndexedItems.get(i).wordId != 0) wordsId.add(allIndexedItems.get(i).wordId);
}
else {
allParags.add(new ParagData(allIndexedItems.get(i).textId, allIndexedItems.get(i).paragNum, wordsId));
wordsId.clear();
curCycledParag = allIndexedItems.get(i).paragNum;
curCycledTextId = allIndexedItems.get(i).textId;
}
}
return allParags;
}
在此代码中我:
allIndexedItems = GuiFindFrags.myConnection.getAllIndexedItems(indexed_data_tab);
获取对象的ArrayList allIndexedItems,描述文本中的单词(文本在mysql表中)。该对象具有以下参数:
此对象的构造函数中还有其他参数,但这里不使用它们。 所以这个ArrayList描述了所有文本中的所有单词。
int curCycledParag = 1; //current paragraph num
int curCycledTextId = 1; //current text id
为当前文本和当前段落创建变量。他们将在周期中改变。
同样在初始化时我创建了HashSet<Integer> wordsId
- 在这个HashSet中,应该添加一个段文本的所有word_id。
因此,我开始循环将word_ids
添加到HashSet
,同时text_id
每个单词allIndexedItems.get(i).textId
)=当前文本(变量curCycledTextId
)和单词段落( allIndexedItems.get(i).paragNum
)=变量curCycledParag
的值。
SO:当段落的所有单词都添加到HashSet中时,我必须创建另一个对象,描述段落 - 对象ParagData(它具有:
并且在开始时我创建了一个ArrayList<ParagData> allParags
来添加所有段落对象。该函数返回此arrayList。
因此,当所有段落单词都添加到HashSet时,我创建一个新对象ParagData并将其添加到ArrayList allParags。之后我清理HashSet并使用老化来添加下一段的单词ID。
else {
allParags.add(new ParagData(allIndexedItems.get(i).textId, allIndexedItems.get(i).paragNum, wordsId));
wordsId.clear();
curCycledParag = allIndexedItems.get(i).paragNum;
curCycledTextId = allIndexedItems.get(i).textId;
}
return allParags;
当我向ArrayList添加新的ParagData对象时,其值会发生变化 - 因此不会将相关值添加到allParags ArrayList
答案 0 :(得分:0)
为每个ParagDat创建一个新的Hashset对象。 Hashset在创建后不是不可变的。您所处理的区域是同一个对象。