4

私は実装するこのクラスを持っていますFilenameFilter

package Logic;

 import java.io.File;
 import java.io.FilenameFilter;

public class Filter implements FilenameFilter {

 String name; 

 public Filter(String name) {
    this.name = name; 

 }
 @Override
 public boolean accept(File dir, String filename) {
    return name.contains("bluetooth");
 }
}

このメソッドでこのクラスを使用します。

public String searchForBluetoothFolder() {

    String folderNameToSearchFor = "bluetooth";
    File root = sdCard; 
    FilenameFilter filter = new Filter(folderNameToSearchFor);  

    String[] bluetoothFolder = root.list(filter);

    for(int i = 0; i < bluetoothFolder.length; i++) {
        Log.i("Bluetooth: ", bluetoothFolder[i]); 
    }


    return "";
}

for ループ内では、ルート ディレクトリ内のすべてのファイルが出力され、bluetooth という名前のファイルは出力されません。ここで何が間違っていますか?

4

4 に答える 4

4

これは、「bluetooth」という単語が含まれているnameかどうかではなく、「bluetooth」が含まれているかどうかを確認しているためです。fileName

return name.contains("bluetooth");に変更する必要があります return filename.contains("bluetooth");

ただし、実装しようとしている方法で、指定したが含まれているreturn filename.contains(name);かどうかを実際に確認できるように変更してください。fileNamename

contains()また、「bluetooth」は「Bluetooth」や「blueTooth」と同じように評価されない可能性があることに注意してください。大文字と小文字を区別しない検索が必要な場合は、standardizeあなたの名前をお勧めします。name小文字に設定し、 を使用して確認しfilename.toLowerCase().contains(name.toLowerCase())ます。何かのようなもの:

public class Filter implements FilenameFilter {
 String name; 

 public Filter(String name) {
    this.name = name; 

 }
 @Override
 public boolean accept(File dir, String filename) {
    //If you want to perform a case-insensitive search
    return filename.toLowerCase().contains(name.toLowerCase());
 }
}
于 2012-08-29T08:22:15.580 に答える
1

属性名に含まれるメソッドを呼び出していますが、代わりにパラメーターファイル名で呼び出しています。また、次のようにして、メソッドからリテラル文字列を削除する必要があります。

filename.contains(name)

このようにして、作成した属性を使用し、別のケースでクラスを再利用できます。同じことが searchForBluetoothFolder メソッドにも当てはまります。

于 2012-08-29T08:20:35.663 に答える
1
package Logic;

 import java.io.File;
 import java.io.FilenameFilter;

public class Filter implements FilenameFilter {

 String name; 

 public Filter(String name) {
    this.name = name; 

 }
 @Override
 public boolean accept(File dir, String filename) {
    return filename.contains("bluetooth");
 }
}
于 2012-08-29T08:24:54.223 に答える
1
FileFilter folderFilter = new FileFilter() {
    @Override
    public boolean accept(File file) {
        return file.isDirectory() && file.getName().contains("bluetooth");
    }
};

File[] files = f.listFiles(folderFilter);
于 2012-08-29T08:23:40.217 に答える