Преобразование ArrayList в ArrayList java

#java #android #arraylist

#java #Android #arraylist

Вопрос:

Мне удалось преобразовать arraylist некоторого класса (в моем случае это класс, который расширяется ArrayAdapter<Question> ) в ArrayList<String> . Я передал его через пакет Android intent и получил с помощью метода getStringArrayList. Теперь мне нужно преобразовать его обратно в ArrayList<Question> , чтобы настроить мой адаптер

Преобразование из ArrayList<Question> в ArrayList<String>

        questionlists = task.execute(myitem).get();

        for (Question object : questionlists) 
        {
            strings.add(object != null ? object.toString() : null);
        }
        simpleArray2 = new String[strings.size()];
        strings.toArray(simpleArray2);
  

Преобразование обратно в ArrayList<Question>

  List<Question> variable;
 lists = getArguments().getStringArrayList("Question");
     variable = (List<Question>)(List<?>) lists;

  @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.main_world, container, false);
    ListView lv = (ListView) view.findViewById(R.id.list_sessions);
    final QuestionAdapter adapter = new QuestionAdapter(getActivity(), variable);
    lv.setAdapter(adapter);
    //ArrayAdapter<String> adapter = new ArrayAdapter<String>(  
             //inflater.getContext(), android.R.layout.simple_list_item_1,  
             //lists);  
   // lv.setAdapter(adapter);             
    return view;
}
  

Я добавил попытку / перехватить свой адаптер, и я получаю ошибку:

java.lang.Строка не может быть преобразована в java.com.example.Вопрос.

Что я делаю не так? Это потому, что я сначала не преобразовал обратно в правильный ArrayList?

Комментарии:

1. variable = (List<Question>)(List<?>) lists; что за. Это не сработает.

2. Именно здесь я пытаюсь преобразовать arraylist<String>, который я передал через мой вызов putStringArrayList , в ArrayList вопросов, чтобы я мог отобразить его в моем адаптере

3. List<Question> это не то же самое, что List<String> потому Question , что это не то же самое, что String . Вы должны создать Question класс Parcelable , используя parcelabler.com и отправьте массив Parcelable вместо String.

Ответ №1:

В вашем первом примере вы на самом деле не приводите a Question к a String . Вы вызываете toString() метод для Question .

Например,

 public class Question {

    //instance member
    String question;

    public String toString() {
       return question;
    }
}
  

Чтобы перейти от a String к a Question , вам придется написать конструктор или метод, который принимает String в качестве параметра и возвращает Question .

Например, вы могли бы добавить этот конструктор в свой Question класс:

 public Question(string myQuestion) {
     question = myQuestion;
}
  

Комментарии:

1. Как бы вы посоветовали мне это сделать? В моем первом примере strings — это массив из строк.

2. @user1397978 Надеюсь, мое обновление поможет объяснить ситуацию.

Ответ №2:

Хорошо. Для преобразования из List<Question> в List<String> вы уже делаете это:

Преобразование из ArrayList в ArrayList

    List<Question> questionlists = task.execute(myitem).get();
   List<String> strings = new ArrayList<String>();

    for (Question object : questionlists) 
    {
        strings.add(object != null ? object.toString() : null);
    }
  

Теперь, чтобы преобразовать из List<String> в List<Question> , вам нужно будет сделать точно то же самое, только наоборот:

    List<String> strings = ... result from above
   List<Question> questionlists = new ArrayList<Question>();

    for (String object : strings) 
    {
        questionlists.add(object != null ? object.toQuestion() : null);
    }
  

О, подождите! String не имеет toQuestion() метода! Что теперь? Ну, мы просто создаем такой метод сами. Поскольку это будет метод, создающий Question объект, почему бы не сделать его конструктором Question, принимая строку в качестве параметра?

    List<String> strings = ... result from above
   List<Question> questionlists = new ArrayList<Question>();

   for (String object : strings) 
   {
       questionlists.add(object != null ? new Question(object) : null);
   } 
  

Теперь все, что осталось сделать, это добавить этот конструктор в ваш класс вопросов.

 class Question {
    public Question(String string) {
        // implementing this the right way is up to you...
    }
}
  

Комментарии:

1. Спасибо! Казалось, это очень помогло и имеет такой смысл!

Ответ №3:

toString() это метод, который есть у всех объектов Java Object . По умолчанию в нем будет указано имя класса и местоположение ссылки в памяти. На самом деле вы не преобразуете объект Question в String . Вы генерируете String то, что в некотором what интерпретирует то, что Question есть. Например, вы можете перезаписать toString() , чтобы сгенерировать все, что захотите.

 public class Question {

  String mQuestion;

  @Override
  public String toString() {
     return mQuestion;
  }
}
  

Теперь, что вы можете сделать, это создать какую-то пользовательскую строку в, toString() которая полностью представляет ваш Question объект. Затем создайте fromString метод, который анализирует вашу пользовательскую строку и создает из нее новые Question объекты. Однако этот метод подвержен ошибкам и имеет ограничения.

Лучшим методом было бы либо наследование Question от Serializable , либо, что еще лучше, разделяемое. Выполнение этого позволяет вам поместить фактический Question объект в пакет и извлечь его из намерения без какого-либо преобразования.

Ответ №4:

Вы должны правильно понимать приведение типов.

Приведение типов не является преобразованием. Он просит java предположить для остальной части этого контекста, что реальный тип этого объекта является тем, что вы говорите. Вы говорите java, что, хотя это не очевидно в текущем контексте, вы лучше знаете, каков фактический тип объекта.

Информация о точном типе объекта доступна не во всех контекстах. При передаче объектов методы обрабатывают их как любой из своих типов суперклассов вплоть до Object .

Приведение типов — это способ сообщить java, что «Я уже знаю, что это список<Вопрос>, потому что я знаю, кто поместил туда этот объект».

Таким образом, приведение типов не может помочь с преобразованием. Объект уже должен быть такого типа, чтобы приведение к типу работало.

Если это другой тип, вам придется написать код для его преобразования.

 public class ListProcessing {
public static void main(String[] args) {

    List<Integer> ints = Arrays.asList(1,2,3);

    //Take a list, convert and add to new list
    List<String> intStrs = listTransform(ints, new Converter<Integer, String>() {
        @Override
        public String convert(Integer input) {
            return input==null?null:"S" input.toString();
        }           
    });

    System.out.println(intStrs);
}

//Generic list processor
protected static <T,U> List<U> listTransform(List<T> in, Converter<T,U> converter){
    if(in==null) return null;
    List<U> out = new ArrayList<>();
    for(T item:in){
        out.add(converter.convert(item));
    }
    return out;
}

//An interface for a converter, which converts a single item
private static abstract class  Converter <T,U>{
    public abstract U convert(T input);
}
}