首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >生成唯一的ids对

生成唯一的ids对
EN

Stack Overflow用户
提问于 2021-11-11 12:53:50
回答 1查看 106关注 0票数 0

我试图生成所有可能的唯一I对。目前,我正试图用这样的两种方法来实现它:

代码语言:javascript
运行
复制
private prepareNewList(userIds: number[], existedPartnerList: string[]) {
    const newPartnerList = [];
    let usedUsersIds = [];

    for (let i = 0; i < userIds.length - 1; i++) {
      for (let j = i + 1; j < userIds.length; j++) {
        if (usedUsersIds.includes(userIds[i])) {
          continue;
        }

        const pair = ${userIds[i]}-${userIds[j]};
        const reversedPair = ${userIds[j]}-${userIds[i]};

        if (
          !existedPartnerList.includes(pair) &&
          !existedPartnerList.includes(reversedPair)
        ) {
          newPartnerList.push(pair);
          usedUsersIds.push(userIds[i], userIds[j]);

          break;
        }
      }
    }

    usedUsersIds = [];

    for (let i = userIds.length - 1; i > 0; i--) {
      for (let j = i - 1; j >= 0; j--) {
        if (usedUsersIds.includes(userIds[j])) {
          continue;
        }

        const pair = ${userIds[i]}-${userIds[j]};
        const reversedPair = ${userIds[j]}-${userIds[i]};

        if (
          !existedPartnerList.includes(pair) &&
          !existedPartnerList.includes(reversedPair) &&
          !newPartnerList.includes(pair) &&
          !newPartnerList.includes(reversedPair)
        ) {
          newPartnerList.push(pair);
          usedUsersIds.push(userIds[i], userIds[j]);

          break;
        }
      }
    }

    return this.filterPairs(newPartnerList);
  }

private filterPairs(pairs: string[]): string[] {
    const usedIds = [];
    const pairsToRemove = [];
    pairs = pairs.sort(() => Math.random() - 0.5);

    for (let i = 0; i < pairs.length; i++) {
      const parsedPair = pairs[i].split('-');

      if (parsedPair.some((id) => usedIds.includes(id))) {
        pairsToRemove.push(pairs[i]);
      }

      usedIds.push(...parsedPair);
    }

    return pairs.filter((item) => !pairsToRemove.includes(item));
  }

但它不能正常工作。当我第一次运行脚本时,我从第一个方法获得['1-2', '3-4', '5-6', '6-4', '5-3', '4-2', '3-1'],过滤后得到[ '1-2', '3-4', '5-6' ],这是正确的(例如,'6-4‘对的数字已经在'3-4’和‘5-6’中使用了)。

当我第二次运行脚本时,我从第一个方法获得[ '1-3', '2-3', '4-5', '6-4', '5-3', '4-2' ],过滤后得到[ '1-3', '4-5' ],这是不正确的,因为还有一对[ '6-2' ][ '2-6' ]

所以我的方法不像我预期的那样有效。我该怎么做才能让这件事奏效?

编辑1:

我想每个月运行这个脚本来生成唯一的用户对。例如,在这个月中,我创建了对“用户1-用户2”。因此,在这个月里,我不能再使用用户1和用户2,也不能永远使用对“用户1-用户2”。

编辑2:

也许我解释得不对,或者解释得不太准确。每个月我都要生成唯一的用户对。例如,我有6个用户(总有偶数),在第一开始我可以根据自己的需要生成它们,因为数据库中的表是空的。例如: 1-2,3-4,5-6。接下来的一个月,我再次运行脚本,假设用户的数量没有改变,现有的对(1-2,3-4,5-6)是从基中提取的,基于这些现有的对,我必须创建不会重复的新对(例如1-4、2-6、3-5)。所以每个月都会增加用户,相应地,收益也会增加。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-11 13:02:44

2(不重复使用)

如果我正确地理解了更新的需求,那么像这样的递归函数如何?

代码语言:javascript
运行
复制
function generatePairs(ids) {
  const uniqueIds = Array.from(new Set(ids));
  const results = [];
  function generateNext(idBag, pairs = []) {
    const [a, ...rest] = idBag;
    rest.forEach((b) => {
      const newPairs = [...pairs, [a, b]];
      const next = rest.filter((e) => e !== b);
      if (next.length >= 2) {
        generateNext(next, newPairs);
      } else {
        results.push({ pairs: newPairs, rest: next });
      }
    });
  }
  generateNext(uniqueIds);
  return results;
}

对于偶数的用户来说,例如,

代码语言:javascript
运行
复制
generatePairs(["John", "Mary", "Anne", "Zalgo", "Kenny", "Ben"]).forEach((result) => {
  console.log(result.pairs, result.rest);
});

结果是

代码语言:javascript
运行
复制
[ [ 'John', 'Mary' ], [ 'Anne', 'Zalgo' ], [ 'Kenny', 'Ben' ] ] []
[ [ 'John', 'Mary' ], [ 'Anne', 'Kenny' ], [ 'Zalgo', 'Ben' ] ] []
[ [ 'John', 'Mary' ], [ 'Anne', 'Ben' ], [ 'Zalgo', 'Kenny' ] ] []
[ [ 'John', 'Anne' ], [ 'Mary', 'Zalgo' ], [ 'Kenny', 'Ben' ] ] []
[ [ 'John', 'Anne' ], [ 'Mary', 'Kenny' ], [ 'Zalgo', 'Ben' ] ] []
[ [ 'John', 'Anne' ], [ 'Mary', 'Ben' ], [ 'Zalgo', 'Kenny' ] ] []
[ [ 'John', 'Zalgo' ], [ 'Mary', 'Anne' ], [ 'Kenny', 'Ben' ] ] []
[ [ 'John', 'Zalgo' ], [ 'Mary', 'Kenny' ], [ 'Anne', 'Ben' ] ] []
[ [ 'John', 'Zalgo' ], [ 'Mary', 'Ben' ], [ 'Anne', 'Kenny' ] ] []
[ [ 'John', 'Kenny' ], [ 'Mary', 'Anne' ], [ 'Zalgo', 'Ben' ] ] []
[ [ 'John', 'Kenny' ], [ 'Mary', 'Zalgo' ], [ 'Anne', 'Ben' ] ] []
[ [ 'John', 'Kenny' ], [ 'Mary', 'Ben' ], [ 'Anne', 'Zalgo' ] ] []
[ [ 'John', 'Ben' ], [ 'Mary', 'Anne' ], [ 'Zalgo', 'Kenny' ] ] []
[ [ 'John', 'Ben' ], [ 'Mary', 'Zalgo' ], [ 'Anne', 'Kenny' ] ] []
[ [ 'John', 'Ben' ], [ 'Mary', 'Kenny' ], [ 'Anne', 'Zalgo' ] ] []

对于一个奇数(我们不能将每个人配对),rest中未配对的go

代码语言:javascript
运行
复制
# ["John", "Mary", "Anne", "Zalgo", "Kenny"]

[ [ 'John', 'Mary' ], [ 'Anne', 'Zalgo' ] ] [ 'Kenny' ]
[ [ 'John', 'Mary' ], [ 'Anne', 'Kenny' ] ] [ 'Zalgo' ]
[ [ 'John', 'Anne' ], [ 'Mary', 'Zalgo' ] ] [ 'Kenny' ]
[ [ 'John', 'Anne' ], [ 'Mary', 'Kenny' ] ] [ 'Zalgo' ]
[ [ 'John', 'Zalgo' ], [ 'Mary', 'Anne' ] ] [ 'Kenny' ]
[ [ 'John', 'Zalgo' ], [ 'Mary', 'Kenny' ] ] [ 'Anne' ]
[ [ 'John', 'Kenny' ], [ 'Mary', 'Anne' ] ] [ 'Zalgo' ]
[ [ 'John', 'Kenny' ], [ 'Mary', 'Zalgo' ] ] [ 'Anne' ]

采取1(所有对,与重用)

像这样的事不管用吗?需要特别小心才能确保输入没有重复,并对结果进行排序.

代码语言:javascript
运行
复制
function generatePairs(ids) {
  const uniqueIds = Array.from(new Set(ids));
  const outSet = new Set();
  for (let i = 0; i < uniqueIds.length; i++) {
    for (let j = i + 1; j < uniqueIds.length; j++) {
      outSet.add(`${uniqueIds[i]}-${uniqueIds[j]}`);
    }
  }
  const out = Array.from(outSet);
  out.sort();
  return out;
}


console.log(generatePairs([1, 1, 2, 3, 4, 5, 5, 6]));

输出是

代码语言:javascript
运行
复制
[
  '1-2', '1-3', '1-4',
  '1-5', '1-6', '2-3',
  '2-4', '2-5', '2-6',
  '3-4', '3-5', '3-6',
  '4-5', '4-6', '5-6'
]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69928646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档