Лучший способ использовать содержит в ArrayList в Java?

Это должно сделать это

replacements = {'zero':'0', 'temp':'bob', 'garbage':'nothing'}

with open('path/to/input/file') as infile, open('path/to/output/file', 'w') as outfile:
    for line in infile:
        for src, target in replacements.iteritems():
            line = line.replace(src, target)
        outfile.write(line)

РЕДАКТИРОВАТЬ : Чтобы обратиться к комментарию Eildosa , если вы хотите сделать это без записи в другой файл, то вы ' В конечном итоге вам придется читать весь исходный файл в память:

lines = []
with open('path/to/input/file') as infile:
    for line in infile:
        for src, target in replacements.iteritems():
            line = line.replace(src, target)
        lines.append(line)
with open('path/to/input/file', 'w') as outfile:
    for line in lines:
        outfile.write(line)

Редактировать: Если вы используете Python 3.x, используйте replacements.items() вместо replacements.iteritems()

8
задан Pesto 12 June 2009 в 03:32
поделиться

5 ответов

Most likely, you have simply forgotten to override equals() and hashCode() in your type. equals() is what contains() checks for.

From the Javadoc:

Returns true if this list contains the specified element. More formally, returns true if and only if this list contains at least one element e such that (o==null ? e==null : o.equals(e)).

Since the default implementation of equals tests for reference equality, it's not suitable for custom data types like this one.

(And if you didn't override equals and hashCode, using your types as keys in a HashMap would be equally futile.)


Edit: Note that to override, you must provide the exact signature.

class MyDataType {
    public boolean equals(MyDataType other) { // WRONG!
        ...
    }
    public boolean equals(Object other) { // Right!
        ...
    }
}

This is a very strong argument for using the @Override annotation; the first example would have failed at compile time if annotated with @Override.

23
ответ дан 3 November 2019 в 12:27
поделиться

Я предполагаю, что вместо этого вы написали только "строго типизированный" метод равенства переопределения equals (Object). Другими словами, если у вас есть:

public boolean equals(Foo f)

, вам также понадобится

public boolean equals(Object o)

, чтобы переопределить Object.equals.

Это соответствовало бы «равно работает, но не содержит, потому что ваши тесты, вероятно, вызывают строго типизированный равно, а ArrayList - нет.

14
ответ дан 3 November 2019 в 12:27
поделиться

Вы переопределили метод equals? Это необходимо для правильной работы содержимого.

3
ответ дан 3 November 2019 в 12:27
поделиться

может быть, вместо этого использовать класс Integer? тогда вы можете выполнить сравнение объектов

0
ответ дан 3 November 2019 в 12:27
поделиться

Помните, что если вы не переопределите метод equals (), тогда два объекта вашего типа будут равны, только если они один и тот же экземпляр этого объекта. Класс ArrayList использует этот метод для проверки того, что он содержит данный объект. Кроме того, вам необходимо точно сопоставить подпись, что означает, что она должна принимать в качестве параметра Object, а не Foo.

Кроме того, в контракте с объектом указано, что вы должны переопределять hashCode () всякий раз, когда вы переопределяете equals (). Если вы этого не сделаете, то HashMap или HashSet не идентифицируют ваши два объекта как равные, даже если это делает ArrayList (HashMap проверяет идентичные хэши, а затем вызывает на них equals () для проверки фактического равенства). Таким образом, если ArrayList говорит, что два элемента не равны, то HashMap тоже не будет.

2
ответ дан 3 November 2019 в 12:27
поделиться
Другие вопросы по тегам:

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