Строковое равенство по сравнению с равенством местоположения

Я думаю, вы должны помнить о следующих вещах.

  1. Вам нужно обработать все подкаталоги. Вы можете сделать это с помощью рекурсивного или итеративного подхода. Я предпочитаю первый что-то вроде этого:
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

Итеративный выглядит очень похоже.

  1. Вам необходимо получить информацию об определенном файле. os.stat возвращает все необходимые данные: st_size для размера и st_ctime для времени создания в секундах. Вы можете использовать datetime.datetime.fromtimestamp для преобразования секунд в читаемый формат.

  2. Также необходима функция для сравнения размеров. Например,

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.

  1. Функция os.path.exists обеспечивает возможность проверки пути к каталогу.
7
задан Bill the Lizard 27 February 2009 в 13:02
поделиться

6 ответов

Java только автоматически интернирует Строковые литералы. Новые Строковые объекты (созданное использование new ключевое слово), не интернируются по умолчанию. Можно использовать String.intern () метод для интернирования существующего Строкового объекта. Вызов intern проверит существующий Строковый пул на соответствующий объект и возвратит его, если Вы будете существовать, или добавьте его, если там не шел ни в какое сравнение.

Если Вы добавляете строку

s3 = s3.intern();

к Вашему коду прямо после создания s3, Вы будете видеть различие в своем выводе.

Посмотрите еще некоторые примеры и более подробное объяснение.

Это, конечно, поднимает очень важную тему того, когда использовать == и когда использовать equals метод в Java. Вы почти всегда хотите использовать equals при контакте со ссылками на объект. == оператор сравнивает ссылочные значения, который почти никогда не является, что Вы означаете сравнивать. Знание различия помогает Вам решить, когда уместно использовать == или equals.

15
ответ дан 6 December 2019 в 07:52
поделиться

Вы явно называете новыми для s3, и это оставляет Вас с новым экземпляром строки.

3
ответ дан 6 December 2019 в 07:52
поделиться

Новое ключевое слово всегда делает новую строку.

Больше детали здесь.

1
ответ дан 6 December 2019 в 07:52
поделиться

Создание a String на самом деле быстрый процесс. Попытка найти любого ранее созданным String будет намного медленнее.

Рассмотрите то, что необходимо сделать для создания всех Strings интернированный. Необходимо искать ряд всех ранее созданных Strings. Обратите внимание, что это должно быть сделано ориентированным на многопотоковое исполнение способом, который добавляет наверху. Поскольку Вы не хотите, чтобы это протекло, необходимо использовать некоторую форму (ориентированных на многопотоковое исполнение) несильных ссылок.

Конечно, Вы не можете реализовать Java как это, потому что библиотека, к сожалению, подвергает конструкторов для Strings и большинство других неизменных объектов значения.

2
ответ дан 6 December 2019 в 07:52
поделиться

Почему все строки не имеют того же расположения в памяти, если все три имеют то же содержание?

Поскольку они - различные строки с тем же содержанием!

1
ответ дан 6 December 2019 в 07:52
поделиться

Существует метод по имени 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 ();

1
ответ дан 6 December 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: