为了账号安全,请及时绑定邮箱和手机立即绑定

如何从多个列表创建匹配对象的列表并删除匹配列表中的对象以使其反映在原始列表中

如何从多个列表创建匹配对象的列表并删除匹配列表中的对象以使其反映在原始列表中

素胚勾勒不出你 2023-08-16 17:41:42
如果有人问过这个问题,我很抱歉,但我无法从谷歌搜索中找到类似的内容,所以就到这里。假设我有两个对象笔记本public class NoteBook {    private String name;    private String description;    public NoteBook(String name, String description) {        this.name = name;        this.description = description;    }}和笔记public class Note {    private String sourceNoteBook    private String name;    private String category;    private String details;    public Note(String sourceNoteBook,String name, String category, String details) {        this.sourceNoteBook = sourceNoteBook;        this.name = name;        this.category = category;        this.details = details;    }}在程序中,用户可以创建多个NoteBook对象,每个NoteBook存储可变数量的注释。最终我想添加一个搜索功能,可以按类别或名称搜索笔记并返回找到的笔记列表。通常我会使用 2 个 For 循环来迭代笔记本列表,然后迭代每个笔记本的笔记列表并比较字符串。像这样的东西:    For (NoteBook noteBook: noteBooks) {        For(Note note :noteBooks.getNoteList){            if (note.getCategory().contains(someString)) {                matchingNotes.add(notes);            }        }    }但是,我现在希望能够从匹配注释列表中删除注释,以便原始笔记本中的注释也被删除。存储和搜索这两个类的最佳方法是什么,以便我可以实现这样的功能。编辑:只是为了澄清,最终结果是我希望用户能够在所有笔记本中搜索笔记类别,然后程序将返回与该类别匹配的笔记列表。然后,他/她可以从该列表中删除笔记,这样它也会在原始笔记本中删除。例如,完全从程序中删除。
查看完整描述

3 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

迭代器:

可能是最简单的解决方案。由于 java 在循环中使用迭代器foreach,因此性能是相同的。


For (NoteBook noteBook: noteBooks) {

  Iterator<Note> it = noteBooks.getNoteList().iterator();

  while (it.hasNext()) {

    Note note = it.next();

    if (note.getCategory().equals(someString)) {

      it.remove();

    }

  }

}

SQL:

这将是最佳的。然而,即使使用轻量级的东西,例如 H2 或 SQLite,也需要重构。在非常轻量级的应用程序中也不是一个选项。


高效:

如果您只按类别或名称搜索,您可以使用 2 个地图:


Map<String, Note> notesByCategory;

Map<String, Note> notesBytName

这将需要O(n)内存来存储映射,但会及时进行非常高效的查找O(1)(与当前的O(n)相比)。我会避免这种解决方案,因为很容易在笔记内容和地图之间实现不一致的状态。


编辑:


var newNoteNames = newList.stream().map(Note::getName).collect(Collectors.toSet());

var oldNoteNames = noteBooks.stream().flatMap(Notebook::getNodeList).map(Note::getName).collect(Collectors.toSet());


var removedNames = oldNoteNames.removeAll(newNoteNames);


for (var removedName : removedNames) {

  for (NoteBook noteBook: noteBooks) {

    Iterator<Note> it = noteBooks.getNoteList().iterator();

    while (it.hasNext()) {

      Note note = it.next();

      if (note.getName().contains(removedName)) {

        it.remove();

      }

    }

  }

}


查看完整回答
反对 回复 2023-08-16
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

为什么不将笔记本信息存储在 note 类中呢?


public class Note {

    private NoteBook sourceNoteBook;

    private String name;

    private String category;

    private String details;


    public Note(NoteBook sourceNoteBook,String name, String category, String details) {

        this.sourceNoteBook = sourceNoteBook;

        this.name = name;

        this.category = category;

        this.details = details;

    }

}

需要注意的每个数据操作都会影响存储它的笔记本


查看完整回答
反对 回复 2023-08-16
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

当键是笔记并且值是笔记本时,您可以创建一个地图 keySet 将返回给用户,一旦他选择了该键,您就有了知道要从哪个笔记本中删除的值,并且您有可以删除该笔记本的键笔记。这是你的意思吗?



查看完整回答
反对 回复 2023-08-16
  • 3 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信