我一直在尝试为 ImageJ 编写一个解决方案来处理我的图像。
我了解如何获取目录,在其上运行命令等。但是,我遇到了一种情况,我现在需要开始使用某种类型的搜索功能,以便将两个图像在一个完整的目录中配对在一起图像对。
我希望你们能够确认我的方向是正确的,我的想法是正确的。到目前为止,这对我来说还是很难理解,因为我的 Java 经验还不到一个月。由于这个项目直接用于我的研究,我确实有足够的动力来完成它,我只需要一些关于哪些功能对我有用的指导。
我最初考虑使用正则表达式,但我发现当你开始处理大量图像时(特别是使用 imagej,它似乎不能很好地转储数据使用情况,如果这是正确的说法的话)regex is very slow .
这些图像的一般格式是:
- someString_DAPI_0001.tif
- someString_GFP_0001.tif
- someString_DAPI_0002.tif
- someString_GFP_0002.tif
- someString_DAPI_0003.tif
- someString_GFP_0003.tif
它们按字母顺序排列,因此应该能够转到列表中的下一个图像。我只是有点不知道应该使用哪些函数来完成此任务,但我认为我的整体 while 结构是正确的。感谢 Java 论坛的一些帮助。然而我仍然不知道下一步该去哪里。
到目前为止,这是我的代码:感谢 this SO部分代码的答案
int count = 0;
getFile("C:\");
string DAPI;
string GFP;
private void getFile(String dirPath) {
File f = new File(dirPath);
File[] files = f.listFiles();
while (files.length > 0) {
if (/* File name contains "DAPI"*/){
DAPI = File f;
string substitute to get 'GFP' filename
store GFP file name into variable
do something(DAPI, GFP);
}
advance to next filename in list
}
}
到目前为止,我真的不知道如何在字符串中搜索字符串。我见过正则表达式捕获组和其他解决方案,但我不知道处理数百张图像的“最佳”解决方案。
我也不知道用什么函数来替换子字符串。
如果你们能指出最适合这种情况的功能,我将非常感激。我喜欢弄清楚如何自己制作,我只需要帮助获取正确的信息。还想确保我在这里没有犯重大逻辑错误。
最佳答案
如果您的文件名遵循您提到的简单模式,那么您似乎不需要正则表达式。您可以简单地迭代文件并根据文件名是否包含 DAPI 进行过滤,例如见下文。此代码可能过于简化了您的要求,但根据您提供的详细信息我无法判断这一点。
import java.io.*;
public class Temp {
int count = 0;
private void getFile(String dirPath) {
File f = new File(dirPath);
File[] files = f.listFiles();
if (files != null) {
for (File file : files) {
if (file.getName().contains("DAPI")) {
String dapiFile = file.getName();
String gfpFile = dapiFile.replace("DAPI", "GFP");
doSomething(dapiFile, gfpFile);
}
}
}
}
//Do Something does nothing right now, expand on it.
private void doSomething(String dapiFile, String gfpFile) {
System.out.println(new File(dapiFile).getAbsolutePath());
System.out.println(new File(gfpFile).getAbsolutePath());
}
public static void main(String[] args) {
Temp app = new Temp();
app.getFile("C:\\tmp\\");
}
}
注意:根据 Vogel612 的回答,如果您有 Java 8 并且喜欢功能性解决方案,您可以拥有:
private void getFile(String dirPath) {
try {
Files.find(Paths.get(dirPath), 1, (path, basicFileAttributes) -> (path.toFile().getName().contains("DAPI"))).forEach(
dapiPath -> {
Path gfpPath = dapiPath.resolveSibling(dapiPath.getFileName().toString().replace("DAPI", "GFP"));
doSomething(dapiPath, gfpPath);
});
} catch (IOException e) {
e.printStackTrace();
}
}
//Dummy method does nothing yet.
private void doSomething(Path dapiPath, Path gfpPath) {
System.out.println(dapiPath.toAbsolutePath().toString());
System.out.println(gfpPath.toAbsolutePath().toString());
}
关于java - 搜索目录中的文件并根据公共(public)子字符串将它们配对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33680226/