当前位置: 首页 > 面试题库 >

从Java 8 IntStream返回LinkedHashMap

百里修真
2023-03-14
问题内容

我有这个代码。

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

每个timeList<TimePitchValue>的名称产生listTimePitchValue,我希望协会指定的listTimePitchValue具有指定baseTime + timemapListTimePitchValue

为了支持

  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中安排线程同步和通信的最佳方法:队列本质上是线程安全的消息传递工具,这是组织多任务的最佳方法!