Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java:使用HashMap和List排列和检索数据_Java_List_Data Structures_Hashmap - Fatal编程技术网

java:使用HashMap和List排列和检索数据

java:使用HashMap和List排列和检索数据,java,list,data-structures,hashmap,Java,List,Data Structures,Hashmap,我有如下逻辑格式的数据: FolderID-1 FileID-1 FileID-2 FolderID-2 FileID-3 FileID-4 FileID-5 FileID-6 FolderID-3 FileID-7 FileID-8 FileID-9 FileID-10 我有FileID对象的列表,这些对象具有FoldeID 我需要更新此列表中的一个字段,并需要以其他方法传递到此列表 我需要根据该

我有如下逻辑格式的数据:

FolderID-1
    FileID-1
    FileID-2    
FolderID-2
    FileID-3
    FileID-4
    FileID-5
    FileID-6    
FolderID-3
    FileID-7
    FileID-8
    FileID-9
    FileID-10
我有
FileID
对象的列表,这些对象具有
FoldeID
我需要更新此列表中的一个字段,并需要以其他方法传递到此列表

我需要根据该方法中的
FileID&folderid
获取
FileID
对象。 要实现同样的目标,我知道两种方法
1 HashMap

2 HashMap您好,我读了您的cmnt,您可以继续使用字符串键(使用fileid和folder id),该键将适用于您。但您的数据具有良好的逻辑结构。文件id和文件夹id将是唯一的,并且单个文件夹将包含文件id连续的文件。所以,我解决这个问题的方法完全依赖于这个结构

我创建了两个类FileIdObj和FolderIdObj,分别包含文件和文件夹的数据

public static void fileIdBasedOnFileIdAndFolderId( List<FileIdObj> fileList)
    {
        Map<Integer,FolderIdObj> folderIdMap=new HashMap<Integer,FolderIdObj>();
        Map<Integer,FileIdObj> fileIdMap=new HashMap<Integer,FileIdObj>();

        for(int i=0;i<fileList.size();i++)
        {
            FileIdObj file=fileList.get(i);
            fileIdMap.put(file.getFileId(), file);

            int folderId=file.getFolderId();
            FolderIdObj folder=new FolderIdObj();

            if(folderIdMap.containsKey(folderId))
            {
                folder=folderIdMap.get(folderId);
                folder.setEndFileId(file.getFileId());
            }else
            {
                folder.setFolderId(folderId);
                folder.setStartFileId(file.getFileId());
                folder.setEndFileId(file.getFileId());
            }

            folderIdMap.put(folderId, folder);
        }

        Set<Integer> set=folderIdMap.keySet();
        Iterator it=set.iterator();
        while(it.hasNext())
        {
            FolderIdObj obj=folderIdMap.get(it.next());
            System.out.println("folder id: "+obj.getFolderId()+" start fileId: "+obj.getStartFileId()+
                    " end fileId: "+obj.getEndFileId());
        }

        System.out.println();
        System.out.println();

        set=fileIdMap.keySet();
        it=set.iterator();
        while(it.hasNext())
        {
            FileIdObj obj=fileIdMap.get(it.next());
            System.out.println("file id: "+obj.getFileId()+" folder id:"+obj.getFolderId());
        }
    }

我不确定这是否符合您的目的,但如果您创建复合
键{folderID,fileID}
并将其用作具有相应文件值的HashMap键,该怎么办?只需注意Key classis的equals和hashCode方法在我的方法中会有唯一的folderId和fileID,因此,我想保留为Key{folderId+fileID}(两个id的总和)是的,如果
folderId+fileID
是唯一的,这似乎是完美的匹配,因为键“两个id的总和”不保证是唯一的。文件夹7加上文件6将是13。文件夹8加上文件5等于13。更有效的方法是使用长(64位)整数,文件夹id(32位整数)在高32位,文件id(另一个32位整数)在低32位。您可以使用类似于
long key=((long)folderId)的方法创建它
public class FileIdObj {

    private int folderId;
    private int fileId;

    public int getFolderId() {
        return folderId;
    }
    public void setFolderId(int folderId) {
        this.folderId = folderId;
    }
    public int getFileId() {
        return fileId;
    }
    public void setFileId(int fileId) {
        this.fileId = fileId;
    }

}
public class FolderIdObj {

    private int folderId;
    private int startFileId;
    private int endFileId;

    public int getFolderId() {
        return folderId;
    }
    public void setFolderId(int folderId) {
        this.folderId = folderId;
    }
    public int getStartFileId() {
        return startFileId;
    }
    public void setStartFileId(int startFileId) {
        this.startFileId = startFileId;
    }
    public int getEndFileId() {
        return endFileId;
    }
    public void setEndFileId(int endFileId) {
        this.endFileId = endFileId;
    }

}