添加到对象

时间:2015-10-22 09:45:52

标签: java hashset

我正在尝试添加 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);
  1. 获取对象的ArrayList allIndexedItems,描述文本中的单词(文本在mysql表中)。该对象具有以下参数:

    • int text_id(找到该单词的文字)
    • int parag_num(找到文本的哪一段)
    • int word id - (字典中单词的id也在mysql表中)

    此对象的构造函数中还有其他参数,但这里不使用它们。 所以这个ArrayList描述了所有文本中的所有单词。

  2. int curCycledParag = 1; //current paragraph num
    int curCycledTextId = 1; //current text id
    
  3. 为当前文本和当前段落创建变量。他们将在周期中改变。

    1. 同样在初始化时我创建了HashSet<Integer> wordsId - 在这个HashSet中,应该添加一个段文本的所有word_id。 因此,我开始循环将word_ids添加到HashSet,同时text_id每个单词allIndexedItems.get(i).textId)=当前文本(变量curCycledTextId)和单词段落( allIndexedItems.get(i).paragNum)=变量curCycledParag的值。

      SO:当段落的所有单词都添加到HashSet中时,我必须创建另一个对象,描述段落 - 对象ParagData(它具有:

      • int text_id(本段所在文本的ID)
      • int parag_num(文本中的段落数)
      • HashSet wordIdsSet - (段落的所有单词ID)

      并且在开始时我创建了一个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;
      
    2. 当我向ArrayList添加新的ParagData对象时,其值会发生变化 - 因此不会将相关值添加到allParags ArrayList

1 个答案:

答案 0 :(得分:0)

为每个ParagDat创建一个新的Hashset对象。 Hashset在创建后不是不可变的。您所处理的区域是同一个对象。