我有这个代码。
private static Map<Long, List<TimePitchValue>> alternativeMethod(AudioFormat audioformat,
List<ChunkDTO> listChunkDTO, long index, int sizeChunk) {
int numBytesPerSample = audioformat.getSampleSizeInBits() / 8;
int quantitySamples = sizeChunk / numBytesPerSample;
long baseTime = quantitySamples * index;
Map<Long, List<TimePitchValue>> mapListTimePitchValue = new LinkedHashMap<>();
for (int i = 0; i < quantitySamples; i++) {
int time = i;
List<TimePitchValue> listTimePitchValueWithTime = listChunkDTO.stream().map(chunkDTO -> {
int value = extractValue(chunkDTO.getChunk(), numBytesPerSample, time);
TimePitchValue timePitchValue = new TimePitchValue(chunkDTO.getPitch(), baseTime + time, value);
return timePitchValue;
}).collect(Collectors.toList());
listTimePitchValueWithTime.sort(Comparator.comparingInt(TimePitchValue::getValue).reversed());
mapListTimePitchValue.put(baseTime + time, listTimePitchValueWithTime);
}
return mapListTimePitchValue;
}
每个time
值List<TimePitchValue>
的名称产生listTimePitchValue
,我希望协会指定的listTimePitchValue
具有指定baseTime + time
在mapListTimePitchValue
。
为了支持
private static int extractValue(byte[] bytesSamples, int numBytesPerSample, int time) {
byte[] bytesSingleNumber = Arrays.copyOfRange(bytesSamples, time * numBytesPerSample, (time + 1) * numBytesPerSample);
int value = numBytesPerSample == 2
? (Byte2IntLit(bytesSingleNumber[0], bytesSingleNumber[1]))
: (byte2intSmpl(bytesSingleNumber[0]));
return value;
}
public static int Byte2IntLit(byte Byte00, byte Byte08) {
return (((Byte08) << 8)
| ((Byte00 & 0xFF)));
}
public static int byte2intSmpl(byte theByte) {
return (short) (((theByte - 128) & 0xFF)
<< 8);
}
ChunkDTO
类
public class ChunkDTO {
private final byte[] chunk;
private final long index;
private final Integer pitch;
public ChunkDTO(byte[] chunk, long index, Integer pitch) {
this.chunk = chunk;
this.index = index;
this.pitch = pitch;
}
public byte[] getChunk() {
return chunk;
}
public long getIndex() {
return index;
}
public Integer getPitch() {
return pitch;
}
@Override
public String toString() {
return "ChunkDTO{" + "index=" + index + ", pitch=" + pitch
+ ", chunk.length=" + (chunk!=null?chunk.length:"null") +
'}';
}
@Override
public int hashCode() {
int hash = 5;
hash = 29 * hash + (int) (this.index ^ (this.index >>> 32));
hash = 29 * hash + Objects.hashCode(this.pitch);
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final ChunkDTO other = (ChunkDTO) obj;
if (this.index != other.index) {
return false;
}
if (!Objects.equals(this.pitch, other.pitch)) {
return false;
}
return true;
}
}
TimePitchValue
类
public class TimePitchValue {
private int pitch;
private long time;
private int value;
public TimePitchValue() {
}
public TimePitchValue(int pitch, long time, int value) {
this.time = time;
this.pitch = pitch;
this.value = value;
}
public int getPitch() {
return pitch;
}
public void setPitch(int pitch) {
this.pitch = pitch;
}
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
@Override
public String toString() {
int length = String.valueOf(value).length();
String stringValue = new String(new char[12 - length]).replace('\0', ' ') + value;
return "TimeNoteValue{"
+ ", value='" + stringValue + "'}";
}
@Override
public int hashCode() {
int hash = 7;
hash = 13 * hash + this.pitch;
hash = 13 * hash + (int) (this.time ^ (this.time >>> 32));
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final TimePitchValue other = (TimePitchValue) obj;
if (this.pitch != other.pitch) {
return false;
}
if (this.time != other.time) {
return false;
}
return true;
}
}
现在的问题是,是否有可能返回一个排序Map<Long, List<TimePitchValue>>
从IntStream
直接?
(没有先前创建的内容Map<Long, List<TimePitchValue>> mapListTimePitchValue = new LinkedHashMap<>();
,后来又放置了mapListTimePitchValue.put(baseTime + time, listTimePitchValue);
)
这对您有用吗?
public static Map<Long, List<TimePitchValue>> alternativeMethodme(
AudioFormat audioformat, List<ChunkDTO> listChunkDTO,
long index, int sizeChunk) {
int numBytesPerSample = audioformat.getSampleSizeInBits() / 8;
int quantitySamples = sizeChunk / numBytesPerSample;
long baseTime = quantitySamples * index;
return IntStream.range(0, quantitySamples).boxed()
.collect(Collectors.toMap(time -> baseTime + time,
time -> listChunkDTO.stream()
.map(chunkDTO -> new TimePitchValue(
chunkDTO.getPitch(),
baseTime + time,
extractValue(
chunkDTO.getChunk(),
numBytesPerSample,
time)))
.sorted(Comparator.comparingInt(
TimePitchValue::getValue)
.reversed())
.collect(Collectors.toList()),
(a,b)->a,
LinkedHashMap::new));
}
我想我终于明白了。我不得不重新整理方法之类的。
更新。我添加了排序并以LinkedHashMap
问题内容: 如何从作为Tkinter回调执行的函数中获取返回的对象? 显然,这是一个简化的示例。实际上,按钮调用的函数将返回对象,我希望将这些对象附加到将保留在主Python名称空间中的对象列表中,以进行进一步的操作。 无论如何,在这里用户可以使用GUI选择该函数的自变量,然后按下将执行该函数的按钮。但是,该函数的返回值似乎注定会丢失给以太,因为回调函数将不接受返回值。在不使用丑陋的定义的情况下可
问题内容: 这是一个非常基本的请求-响应测试。浏览器使用jQuery $ .ajax API将“来自浏览器的hello”发送到servlet,然后servlet接收此消息,然后使用org.json.simple库创建一个JSON对象,并将带有消息“ hello from server”的JSON响应发送回浏览器。 我在本地主机上运行它,只是假设我的IP地址是123.123.12.123,平台是Ub
问题内容: 我试图做这样的事情: 我认为味精将被设置为my_script.php返回的文本,即jqXHR对象的responseText。由于msg始终设置为“ [object XMLHttpRequest]”,因此显然无法正常工作 有一种快速的1行方法可以做我想要的吗? 谢谢。 问题答案: 经过一些测试,我最终找到了解决方案。 我需要同步调用,$ .get速记函数始终是异步的,因此我将需要使用$
问题内容: 我想使用这样的Promise来调用Google Maps Geocoding API: 当我调用函数请求时,我发现我得到了一个Promise而不是一个值: 为什么不答应。然后在返回值之前执行?我如何从这个承诺而不是另一个承诺中获得价值? 问题答案: 如果您依赖承诺来返回数据,则必须从函数中返回承诺。 一旦调用堆栈中的1个函数异步,那么要继续线性执行,所有要调用它的函数也必须异步。(异步
问题内容: 问题答案: 有很多原因不回来。 但这通常归结为以下事实:执行的命令不会退出。 同样,这可能有很多原因。 一个普遍的原因是该过程产生了一些输出,而你没有从适当的流中读取。这意味着一旦缓冲区已满,进程就会被阻塞,并等待你的进程继续读取。你的进程依次等待另一个进程完成(之所以不会,是因为它等待你的进程,…)。这是一个典型的僵局情况。 你需要不断从流程输入流中读取内容,以确保它不会被阻塞。
问题内容: 我如何获得一个线程以将元组或我选择的任何值返回给Python中的父级? 问题答案: 我建议您在启动线程之前实例化Queue.Queue,并将其作为线程的args之一传递:在线程完成之前,它将结果作为参数接收到的队列中。父母可以或愿意。 队列通常是在Python中安排线程同步和通信的最佳方法:队列本质上是线程安全的消息传递工具,这是组织多任务的最佳方法!