如何在Java Map中添加相同类型的文件名作为键,而总内存作为值?

时间:2018-11-16 06:05:49

标签: java hashmap

假设存在不同类型的不同文件。例如razi.mp3,大小为10mb,test.txt为5 mb,song.mp3为20mb,file.js为100mb,mark.txt为10mb,zoom.js为50mb。我需要打印总大小的文件类型。在这种情况下,我要打印: mp3:30mb 文本:15mb js:150mb 我可以通过在Java中使用map或任何其他解决方案来解决此问题吗?

基本上,我想将map与比较器接口一起使用。任何其他方式都是最欢迎的。

任何类型的帮助和努力都是非常可观的。在此先感谢所有对此问题感兴趣的人。

3 个答案:

答案 0 :(得分:1)

是的。您可以通过地图解决此问题。

  public class FileMeta {

    String name;
    String extension;
    int size;

    public FileMeta(String name, String extension, int size) {
      this.name = name;
      this.extension = extension;
      this.size = size;
    }

    public String getName() {
      return name;
    }

    public FileMeta setName(String name) {
      this.name = name;
      return this;
    }

    public String getExtension() {
      return extension;
    }

    public FileMeta setExtension(String extension) {
      this.extension = extension;
      return this;
    }

    public int getSize() {
      return size;
    }

    public FileMeta setSize(int size) {
      this.size = size;
      return this;
    }

  }

  public static void main(String[] args) {
    Map<String, List<FileMeta>> map = new ConcurrentHashMap<>();
    FileMeta obj1 = new FileMeta("razi", "mp3", 10);
    FileMeta obj2 = new FileMeta("test", "txt", 5);
    FileMeta obj3 = new FileMeta("song", "mp3", 20);
    FileMeta obj4 = new FileMeta("file", "js", 100);
    FileMeta obj5 = new FileMeta("mark", "txt", 10);
    FileMeta obj6 = new FileMeta("zoom", "js", 50);

    putinMap(map, obj1);
    putinMap(map, obj2);
    putinMap(map, obj3);
    putinMap(map, obj4);
    putinMap(map, obj5);
    putinMap(map, obj6);

    map.entrySet().stream().forEach(entry-> {
      int size = entry.getValue().stream().mapToInt(FileMeta::getSize).sum();
      System.out.println(entry.getKey() + " : " + size + " mb");
    });


  }

  private static void putinMap(Map<String, List<FileMeta>> map, FileMeta obj) {
    if (map.containsKey(obj.getExtension())) {
      map.get(obj.getExtension()).add(obj);
    } else {
      ArrayList<FileMeta> list = new ArrayList<>();
      list.add(obj);
      map.put(obj.getExtension(), list);
    }
  }

其中的键是文件类型,例如mp3或txt,值是由一些对象组成,这些对象包含名称,文件大小和扩展名。

您必须在每一行和每个文件大小的总和上进行迭代。

答案 1 :(得分:0)

您可以创建一个FileObject类,其实例成员的名称为,inputstream,大小和类型。

@Getter
@Setter
public class FileObject {
   private String name;
   private InputStream inputStream;
   private String type;
   private Long size;

   public FileObject(String name, InputStream inputStream, String type, Long size) {
    this.name = name;
    this.inputStream = inputStream;
    this.type = type;
    this.size = size;
  }
}

使用数据创建FilObject数组。

然后,您可以创建一个类型属性为键的Map(初始值对应为0),然后为每个Fileobject的大小值添加到映射中的相应键。

Map<String, FileObject> fileObjectMap = new HashMap<>();

之后,您将能够打印所需的输出。
希望对您有所帮助。

答案 2 :(得分:0)

以下作品:

Nova

公共类主要{

import java.util.*;

}