Вы можете сделать это более просто, используя plot()
вместо plot_date()
.
Сначала преобразуем ваши строки в экземпляры Python datetime.date
:
import datetime as dt
dates = ['01/02/1991','01/03/1991','01/04/1991']
x = [dt.datetime.strptime(d,'%m/%d/%Y').date() for d in dates]
y = range(len(x)) # many thanks to Kyss Tao for setting me straight here
Затем сюжет:
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator())
plt.plot(x,y)
plt.gcf().autofmt_xdate()
Результат:
[/g0]
Вам нужно будет клонировать ArrayList
вручную (путем итерации по нему и копирования каждого элемента на новый ArrayList
), потому что clone()
не сделает этого для вас. Причина этого в том, что объекты, содержащиеся в ArrayList
, могут не реализовать Clonable
сами.
Edit: ... и это именно то, что делает код Вархана.
Я думаю, что текущий зеленый ответ плох, почему вы можете спросить?
Способ сериализации также плохой imo, вам может потребоваться добавить Serializable по всему месту.
Итак, какое решение:
Библиотека глубокого клонирования Java Библиотека клонирования - это небольшая библиотека Java с открытым исходным кодом (apache license), которая глубоко клонирует объекты. Объектам не нужно реализовывать интерфейс Cloneable. Эффективно, эта библиотека может клонировать ЛЮБЫЕ java-объекты. Его можно использовать, то есть в реализациях кеша, если вы не хотите, чтобы кешированный объект был изменен или когда вы хотите создать глубокую копию объектов.
Cloner cloner=new Cloner();
XX clone = cloner.deepClone(someObjectOfTypeXX);
Проверьте это на https://github.com/kostaskougios/cloning
Вот решение, использующее общий тип шаблона:
public static <T> List<T> copyList(List<T> source) {
List<T> dest = new ArrayList<T>();
for (T item : source) { dest.add(item); }
return dest;
}
Я всегда использовал эту опцию:
ArrayList<Dog> clonedList = new ArrayList<Dog>(name_of_arraylist_that_you_need_to_Clone);
Я лично добавлю конструктор в Dog:
class Dog
{
public Dog()
{ ... } // Regular constructor
public Dog(Dog dog) {
// Copy all the fields of Dog.
}
}
Затем просто повторите (как показано в ответе Вархана):
public static List<Dog> cloneList(List<Dog> dogList) {
List<Dog> clonedList = new ArrayList<Dog>(dogList.size());
for (Dog dog : dogList) {
clonedList.add(new Dog(dog));
}
return clonedList;
}
Я нахожу преимущество это вам не нужно вкручивать со сломанным клонированным материалом на Java. Это также соответствует тому, как вы копируете коллекции Java.
Еще одна возможность - написать собственный интерфейс ICloneable и использовать его. Таким образом, вы можете написать общий метод клонирования.
cloneList(List<Object>)
или Dog(Object)
?
– cdmckay
15 February 2016 в 02:17
Все стандартные коллекции имеют конструкторы копирования. Используйте их.
List<Double> original = // some list
List<Double> copy = new ArrayList<Double>(original); //This does a shallow copy
clone()
был спроектирован с несколькими ошибками (см. этот вопрос ), поэтому лучше его избегать.
Из Эффективное Java 2nd Edition , пункт 11: разумно отвергнуть клон
Учитывая все проблемы, связанные с Cloneable, можно с уверенностью сказать, что другие интерфейсы не должен расширять его, а классы, предназначенные для наследования (пункт 17), не должны его реализовывать. Из-за многих недостатков некоторые экспертные программисты просто не рекомендуют переопределять метод клонирования и никогда не вызывать его, кроме, возможно, для копирования массивов. Если вы создаете класс для наследования, имейте в виду, что если вы решите не предоставлять хорошо защищенный метод клонирования, для подклассов будет невозможно реализовать Cloneable.
В этой книге также описывается многие конструкторы копирования преимуществ имеют над Cloneable / clone.
- Они не полагаются на механизм создания экстралингвистического объекта, подверженного риску
- . Они не требуют неприемлемого соблюдения
- Они не противоречат правильному использованию конечных полей
- Они не выбрасывают ненужные проверенные исключения
- Они не требуют отбрасываний .
Рассмотрим другое преимущество использования конструкторов копирования: предположим, что у вас есть
HashSet s
, и вы хотите скопировать его какTreeSet
. Метод clone не может предложить эту функциональность, но с конструктором преобразования легко:new TreeSet(s)
.
Я думаю, что нашел очень простой способ сделать глубокую копию ArrayList. Предполагая, что вы хотите скопировать массив String ArrayList.
ArrayList<String>arrayB = new ArrayList<String>();
arrayB.addAll(arrayA);
Сообщите мне, если это не сработает для вас.
Я только что создал lib, способный клонировать объект entity и объект java.util.List. Просто загрузите банку в https://drive.google.com/open?id=0B69Sui5ah93EUTloSktFUkctN0U и используйте статический метод cloneListObject (Список списков). Этот метод не только клонирует список, но также и все элементы сущности.
Другие плакаты верны: вам нужно перебирать список и копировать в новый список.
Однако ... Если объекты в списке неизменяемы - вам не нужно клонировать их , Если ваш объект имеет сложный граф объектов, они также должны быть неизменными.
Другим преимуществом неизменяемости является то, что они также являются потокобезопасными.
Отвратительный способ - сделать это с отражением. Что-то вроде этого сработало для меня.
public static <T extends Cloneable> List<T> deepCloneList(List<T> original) {
if (original == null || original.size() < 1) {
return new ArrayList<>();
}
try {
int originalSize = original.size();
Method cloneMethod = original.get(0).getClass().getDeclaredMethod("clone");
List<T> clonedList = new ArrayList<>();
// noinspection ForLoopReplaceableByForEach
for (int i = 0; i < originalSize; i++) {
// noinspection unchecked
clonedList.add((T) cloneMethod.invoke(original.get(i)));
}
return clonedList;
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
System.err.println("Couldn't clone list due to " + e.getMessage());
return new ArrayList<>();
}
}
original
содержит объекты разных классов, я думаю, что cloneMethod.invoke
потерпит неудачу с исключением, когда он вызывается с неправильным видом объекта. Из-за этого было бы лучше получить конкретный клон Method
для каждого объекта. Или используйте метод clone на Object
(но поскольку он защищен, что может быть неудачным в большем числе случаев).
– Lii
24 August 2016 в 07:44
Пакет import org.apache.commons.lang.SerializationUtils;
Существует метод SerializationUtils.clone(Object);
Пример
this.myObjectCloned = SerializationUtils.clone(this.object);
для вас объекты переопределяют метод clone ()
class You_class {
int a;
@Override
public You_class clone() {
You_class you_class = new You_class();
you_class.a = this.a;
return you_class;
}
}
и вызывают .clone () для объекта Vector obj или ArraiList obj ....
Я нашел способ, вы можете использовать json для сериализации / unserialize списка. Сериализованный список не ссылается на исходный объект при несериализации.
Использование gson:
List<CategoryModel> originalList = new ArrayList<>(); // add some items later
String listAsJson = gson.toJson(originalList);
List<CategoryModel> newList = new Gson().fromJson(listAsJson, new TypeToken<List<CategoryModel>>() {}.getType());
Вы можете сделать это с помощью jackson и любой другой библиотеки json тоже.
Простой способ, используя commons-lang-2.3.jar, что библиотека java для клонирования списка
link download commons-lang-2.3.jar
Как использовать
oldList.........
List<YourObject> newList = new ArrayList<YourObject>();
foreach(YourObject obj : oldList){
newList.add((YourObject)SerializationUtils.clone(obj));
}
Надеюсь, это поможет.
: D
List<Dog> clonedDogs = new ArrayList<>(); dogs.stream().parallel().forEach(d -> clonedDogs.add(new Dog(d)));
– SaurabhJinturkar 28 July 2016 в 23:55parallel
вызывает вызовclonedDogs.add
из нескольких потоков одновременно. Версии, использующиеcollect
, являются потокобезопасными. Это одно из преимуществ функциональной модели библиотеки потоков, тот же код может использоваться для параллельных потоков. – Lii 29 July 2016 в 15:36Unhandled exception type CloneNotSupportedException
наd.clone()
. Объявить исключение или поймать его не решит. – Gustavo 23 August 2016 в 14:25Dog
в этом примере) не поддерживает клонирование. Вы уверены, что он реализует интерфейсClonable
? – Lii 23 August 2016 в 15:06