Я думаю, вы должны помнить о следующих вещах.
def get_all_files(path_to_dir: str) -> dict:
result = dict()
for file_name in os.listdir(path_to_dir):
full_path = os.path.join(path_to_dir, file_name)
if os.path.isdir(full_path):
result.update(get_all_files(full_path))
else:
result[full_path] = "<info-about-file>"
return result
Итеративный выглядит очень похоже.
Вам необходимо получить информацию об определенном файле. os.stat
возвращает все необходимые данные: st_size
для размера и st_ctime
для времени создания в секундах. Вы можете использовать datetime.datetime.fromtimestamp
для преобразования секунд в читаемый формат.
Также необходима функция для сравнения размеров. Например,
def is_need_to_print_file(size: int, min_size: int=0, max_size: int=-1) -> bool:
if size < min_size:
return False
if max_size != -1 and size > max_size:
return False
return True
Точное значение будет проверено, если min_size
равно max_size
.
os.path.exists
обеспечивает возможность проверки пути к каталогу. Java только автоматически интернирует Строковые литералы. Новые Строковые объекты (созданное использование new
ключевое слово), не интернируются по умолчанию. Можно использовать String.intern () метод для интернирования существующего Строкового объекта. Вызов intern
проверит существующий Строковый пул на соответствующий объект и возвратит его, если Вы будете существовать, или добавьте его, если там не шел ни в какое сравнение.
Если Вы добавляете строку
s3 = s3.intern();
к Вашему коду прямо после создания s3
, Вы будете видеть различие в своем выводе.
Посмотрите еще некоторые примеры и более подробное объяснение.
Это, конечно, поднимает очень важную тему того, когда использовать == и когда использовать equals
метод в Java. Вы почти всегда хотите использовать equals
при контакте со ссылками на объект. == оператор сравнивает ссылочные значения, который почти никогда не является, что Вы означаете сравнивать. Знание различия помогает Вам решить, когда уместно использовать == или equals
.
Вы явно называете новыми для s3, и это оставляет Вас с новым экземпляром строки.
Создание a String
на самом деле быстрый процесс. Попытка найти любого ранее созданным String
будет намного медленнее.
Рассмотрите то, что необходимо сделать для создания всех String
s интернированный. Необходимо искать ряд всех ранее созданных String
s. Обратите внимание, что это должно быть сделано ориентированным на многопотоковое исполнение способом, который добавляет наверху. Поскольку Вы не хотите, чтобы это протекло, необходимо использовать некоторую форму (ориентированных на многопотоковое исполнение) несильных ссылок.
Конечно, Вы не можете реализовать Java как это, потому что библиотека, к сожалению, подвергает конструкторов для String
s и большинство других неизменных объектов значения.
Почему все строки не имеют того же расположения в памяти, если все три имеют то же содержание?
Поскольку они - различные строки с тем же содержанием!
Существует метод по имени String.intern, который, по существу, берет все Строки, которые являются тем же, и помещает их в хеш-таблицу (я - вид лжи, но для этого это - понятие, которое имеет значение, не действительность).
String s1 = "BloodParrot is the man";
String s2 = "BloodParrot is the man";
String s3 = new String("BloodParrot is the man").intern();
System.out.println(s1.equals(s2));
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1.equals(s3));
должен иметь их всех являющихся "верным". Это вызвано тем, что (и я лежу немного здесь снова, но это все еще только имеет значение для понятия не действительность), Строка s1 = "BloodParrot является человеком"; сделан что-то как Строка s1 = "BloodParrot является человеком" .intern ();