Linux Find Command
https://leetcode.com/discuss/interview-question/369272/Amazon-or-Onsite-or-Linux-Find-Command Version 1:
class File {
String name;
int size;
int type;
boolean isDirectory;
File[] children;
}
abstract class Filter {
abstract boolean apply(File file);
}
class MinSizeFilter extends Filter {
int minSize;
public MinSizeFilter(int minSize) {
this.minSize = minSize;
}
@Override
boolean apply(File file) {
return file.size > minSize;
}
}
class TypeFilter extends Filter {
int type;
public TypeFilter(int type) {
this.type = type;
}
@Override
boolean apply(File file) {
return file.type == type;
}
}
class FindCommand {
public List<File> findWithFilters(File directory, List<Filter> filters) {
if (!directory.isDirectory) {
return new NotADirectoryException();
}
List<File> output = new ArrayList<>();
findWithFilters(directory, filters, output);
return output;
}
private void findWithFilters(File directory, List<Filter> filters, List<File> output) {
if (directory.children == null) {
return;
}
for (File file : directory.children) {
if (file.isDirectory) {
findWithFilters(file, filters, output);
} else {
boolean selectFile = true;
for (Filter filter : filters) {
if (!filter.apply(file)) {
selectFile = false;
}
}
if (selectFile) {
output.add(file);
}
}
}
}
}
Version 2:
public interface Filter {
public boolean match(File f);
}
public class ExtensionFilter implements Filter {
final private String ext;
public ExtensionFilter(String ext) {
this.ext = ext;
}
public boolean match(File f) {
return f.getName().endsWith("." + ext);
}
}
public class SizeFilter implements Filter {
enum SizeOperator {
LT,
LTE,
EQ,
GT,
GTE
};
private final int size;
private final SizeOperator op;
public SizeFilter(int size, SizeOperator op) {
this.size = size;
this.op = op;
}
public boolean match(File f) {
int actualSize = f.length();
switch (op) {
case LT:
return actualSize < size;
case LTE:
return actualSize <= size;
case EQ:
return actualSize == size;
case GT:
return actualSize > size;
case GTE:
return actualSize >= size;
}
return false;
}
}
public void find(File f, Filter filter, List<Files> files) {
if (f.isDirectory()) {
for (File file : baseDir.listFiles()) {
find(file, filter, files);
}
} else {
if (filter.match(f)) {
files.add(f);
}
}
}
Last updated