当前位置: 首页 > 知识库问答 >
问题:

HashSet在添加到对象后更改其值

白赞
2023-03-14

我试图向ArrayList对象添加构造函数有3个参数(int,int,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 

但object会收到这些:

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);

>

  • 获取对象的ArrayListallIndexedItems,描述文本中的单词(文本在mysql表中)。此对象具有以下参数:

      < li>int text_id(在哪个文本中找到该单词) < li>int parag_num(在文本的哪个段落中找到) < li>int word id -(词典中单词的id,也在mysql表中)

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

    int curCycledParag = 1; //current paragraph num
    int curCycledTextId = 1; //current text id
    

    为当前文本和当前段落创建变量。它们将在周期中更改。

    同样在开始的时候,我创建了< code>HashSet

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

      < li>int text_id(此段落所在文本的id) < li>int parag_num(文本中的段落数) < li>HashSet wordIdsSet -(段落的所有单词id)

    一开始我还创建了一个ArrayList

    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;
    

    当我向数组列表添加新的ParagData对象时,它的值会改变——所以不正确的值会被添加到所有parag的数组列表中


  • 共有1个答案

    彭宜人
    2023-03-14

    为每个段落创建一个新的Hashset对象。Hashset在创建后不是不可变的。你面对的是同一个物体。

     类似资料:
    • 问题内容: 如果我有一个ArrayList,并向其中添加了一个对象,后来又修改了该对象,此更改是否会反映在ArrayList中?还是将对象添加到ArrayList时,Java创建了一个副本并将其添加到ArrayList? 如果将对此对象的引用更改为null怎么办?这是否意味着ArrayList中的对象现在也为空? 问题答案: 这个变化会反映在ArrayList中吗? 是的,因为您在列表中添加了对该

    • 问题内容: 我读过这个问题:更改集合中的元素会更改“等于”语义 但是,我不知道如何解决无法更改HashSet中的项并稍后将其删除的问题。 我有一些示例源代码: 其中TestClass只是一个POJO,它拥有一个变量(加上getter和setter),并实现了hashcode()和equals()。 有人要求显示equals()和hashcode()方法。这些是由eclipse自动生成的: 结果如下

    • 所以我的目标是把一个字符串拆分成一个Word对象数组。我只想要一个对象来表示一个英语单词,这意味着在添加到数组之前应该过滤掉重复的单词。我一辈子都不知道为什么我过滤掉重复单词的标准失败了。我已经尝试了ArrayList和HashSet。我的目标是在字符串中计算该单词的实例,但我还没有实现。 我的单词分类是: 这是我当前的输出: 单词集大小:18 |单词列表大小:18 word: the | cou

    • 我已经创建了JPanel的一个子类来显示图像。我在JFrame的构造函数中实例化这一点,并将其添加到该JFrame中。这很好用。然后我添加了一个带有ActionListener的按钮来更改该图像。我的问题是JFrame不会更新,尽管我已经尝试过重新绘制等。 JPanel的子类: JFrame基本上是这样的 为什么ActionListener中的方法不更新JFrame Hauptfenster中的i

    • 我的任务是实现一个蛮力算法来输出一些n的整数[1,2,…, n]的所有排列。但是,我似乎在将ArrayList对象添加到HashSet时遇到了一些问题: 我发现对“nextPer的连续调用确实找到了所有排列,但是我不明白当我将排列添加到HashSet“allPer的排列”时会发生什么。我在n=3的情况下运行时得到的输出是这样的: [[3, 2, 1, 1, 2, 1, 1, 3, 1, 2], [

    • 我有一个遵循特定模式的整数列表,它很复杂,但例如: 我想用9个副本来扩展列表,但添加一个常量值,每次线性扩展。例如,如果 那么第二个扩展将导致: 所以我想我需要一个循环,循环通过并通过