gpt4 book ai didi

java - 在另一个列表中查找最接近的值

转载 作者:行者123 更新时间:2023-12-01 12:26:35 25 4
gpt4 key购买 nike

如果问题不清楚,请告诉我。我可以提供更多信息。我在 ArrayList 中有以下音符

ArrayList<String> notesList = new ArrayList<>();
notesList.add("A"); //0
notesList.add("A#"); //1
notesList.add("B"); //2
notesList.add("C"); //3
notesList.add("C#"); //4
notesList.add("D"); //5
notesList.add("D#"); //6
notesList.add("E"); //7
notesList.add("F"); //8
notesList.add("F#"); //9
notesList.add("G"); //10
notesList.add("G#"); //11

我有两个子列表,一个用于升序,一个用于降序。它们都包含属于notesList 一部分的注释。

ArrayList<String> ascendList = new ArrayList<>();
ArrayList<String> descendList = new ArrayList<>();

例如:

ascendList = C, D, E, F#, G        //indices in notesList = 3,5,7,9,10
descendList = A, C#, E, F, G, G# // indices in notesList = 0,4,7,8,10,11

我需要通过升序列表然后降序生成模式,反之亦然。示例:

D, E (from Ascending list), E, C# (from Descending list) C,D,E,F#

(Ascend), F,E,C#,A (Descend)

F E C# (Descend), D, E (Ascend)

这样做是有条件的。当我想在升序模式末尾连接降序模式时,我需要找到等于或低于最后一个升序音符的下一个音符,但在降序列表中。

例如:如果 F# 是升序型式中的最后一个音符,则 F 应该是降序式中的第一个音符。如果 E 是升序模式中的最后一个音符,那么 E 又是降序模式中的第一个音符,因为 E 既出现在升序模式中,也出现在降序模式中。同样,当我在降序模式末尾生成升序模式时,我需要找到等于或高于最后一个降序音符的下一个音符。

我不知道该怎么做。我尝试的一种方法是寻找与 notesList 相对应的升序和降序索引,然后考虑映射,然后使用 map.higherKeymap.lowerKey 等方法。但无法继续,因为我无法真正映射它们。

最佳答案

enum Note {
C, C_, D, D_, E, F, F_, G, G_, A, A_, B;

public Note above() {
return ordinal() != values().length - 1
? Note.values()[ordinal() + 1]
: Note.values()[0];
}

public Note below() {
return ordinal() > 0
? Note.values()[ordinal() - 1]
: Note.values()[Note.values().length - 1];
}
}

interface Scale {
ListIterator<Note> joinAfter(Note note);
}

Scale ascending = new Scale() {
List<Note> notes = asList(C, D, E, F_, G);

@Override
public ListIterator<Note> joinAfter(Note note) {
return notes.listIterator(notes.contains(note)? notes.indexOf(note) : notes.indexOf(note.above()));
}
};

Scale descending = new Scale() {
List<Note> notes = asList(A, C_, E, F, G, G_);

@Override
public ListIterator<Note> joinAfter(Note note) {
return notes.listIterator(notes.contains(note)? notes.indexOf(note) : notes.indexOf(note.below()));
}
};

我建议添加您自己的 Iterator 包装器,它将以降序比例调用前一个为下一个(如果您出于某种原因不想在那里反向注释),更重要的是允许您无限循环通过天平。

如果这只是学校作业,你最好坚持使用数字,不要弄乱字符串列表,直到你需要打印出来。顺便说一句,数组在这里将是更好的选择。

关于java - 在另一个列表中查找最接近的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26285495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com