Java 替换类型为数据结构的arraylist中的值

Java 替换类型为数据结构的arraylist中的值,java,arraylist,Java,Arraylist,这可能是一个非常简单的问题,但我仍然会问它 我的arraylist: ArrayList<FileNameData> fileData; 集合方法 public void setFileName(String fName) { fileName = fName; } 我正在尝试将用户输入的文件名替换为数组中已有的文件名 我创建了以下方法 public void setFileName(int index, String fName) { fileData.set(i

这可能是一个非常简单的问题,但我仍然会问它

我的arraylist:

ArrayList<FileNameData> fileData;
集合方法

public void setFileName(String fName) {
   fileName = fName;
}
我正在尝试将用户输入的文件名替换为数组中已有的文件名

我创建了以下方法

public void setFileName(int index, String fName) {
    fileData.set(index, setFileName(fName));
}
我知道获取文件名非常简单

String fName = fileData.get(index).getFileName();

我知道set方法需要索引和新值,但我不确定如何在set中找到setFileName方法

如果我没弄错,那么您需要修改存储在位置
索引中的对象:

public void setFileName(int index, String fName) {
    fileData.get(index).setFileName(fName);
}
或者,再加上几行:

public void setFileName(int index, String fName) {
    // get the fileNameData stored at position index
    FileNameData fileNameData = fileData.get(index);

    // set the new filename
    fileNameData.setFileName(fName);
}

如果您试图从ArrayList中获取特定文件并更改文件名,则需要从列表中获取正确的元素

如果您知道旧文件的索引,则相当简单:

file = list.get(index);
file.setName(newName);
你可以使用的方法。为此,必须正确实现
FileData
对象的and。假设文件名唯一标识文件:

在FileData类中

public boolean equals(Object other)
{
    return other instanceof FileData 
           && this.getFileName().equals(((FileData)other)getName());
}

public int hashCode()
{
    return this.getFileName().hashCode();
}
然后,您可以找到具有给定名称的文件索引并对其进行更新:

FileData file = new FileData();
file.setName(oldName);
int index = list.indexOf(file);
file = list.get(index);
file.setName(newName);

如果我没弄错的话,你有两个类似这样的类:

class SomeClass {
    ArrayList<FileNameData> fileData;

    public SomeClass(){
        fileData = new ArrayList<FileNameData>();   
    }
}
因此,您需要找到一种方法来获取存储当前文件名的索引

一旦有了索引,您就可以执行以下操作(应该在
SomeClass
中执行),这样该类看起来就像:

class SomeClass {
    ArrayList<FileNameData> fileData;

    public SomeClass(){
        fileData = new ArrayList<FileNameData>();   
    }

    public void replaceFileNameAtIndex(int index, String fileName){
           fileData.get(index).setFileName(fileName);
    }
}

为已经存在的文件获取一个新名称并更新它?查找索引的循环是多余的。您只需要
返回fileData.indexOf(file);
@Nivas确实如此,但我认为这样读起来更好(至少在您开始学习使用集合时更容易理解)。我不这么认为。您正在列表上循环,并且仍然调用
indexOf
。这意味着
indexOf
对于一个10长的列表会被调用10次。为什么要循环呢?只需调用
indexOf
。一次。实际上这不是真的。
indexOf()如果文件名彼此相等,则只调用一次。
。同意。但是当调用
indexOf
时,文件名已经相等。因此您根本不需要调用
indexOf
file.getFileName().equals(文件名)
fileData.indexOf(文件名)
是等价的语句。这两种语句都不需要。而且,如果看到
ArrayList.indexOf
的函数,实际上其中有一个循环。因此,对于代码,您最终会在
ArrayList
上循环两次,这根本不需要。
class FileNameData {

    String fileName;

    public FileNameData(TCComponentItemRevision rev, TCComponentDataset selectedDataset, String markUp, String fileName){ ... }

    public void setFileName(String fName) { 
        fileName = fName; 
    }

    public String getFileName() { 
        return fileName;
    }
}
class SomeClass {
    ArrayList<FileNameData> fileData;

    public SomeClass(){
        fileData = new ArrayList<FileNameData>();   
    }

    public void replaceFileNameAtIndex(int index, String fileName){
           fileData.get(index).setFileName(fileName);
    }
}
public int findIndexOfFilleName(String fileName){
     for (FileNameData file : fileData)
        if (file.getFileName().equals(fileName))
            return fileData.indexOf(file);
    return -1; //or some other value indicating not found
}