В приведенных выше ответах не обсуждается назначение среза:
>>> r=[1,2,3,4]
>>> r[1:1]
[]
>>> r[1:1]=[9,8]
>>> r
[1, 9, 8, 2, 3, 4]
>>> r[1:1]=['blah']
>>> r
[1, 'blah', 9, 8, 2, 3, 4]
Это также может прояснить разницу между нарезкой и индексированием.
Для первого вопроса проблема довольно проста. oneName
является String
, а myCelebrityList
представляет собой набор из CelebrityNamesFile
- это означает, что вы можете добавлять объекты в коллекцию типа CelebrityNamesFile
.
Для второй проблемы, ваша проблема в том, что класс CelebrityNamesFile
не реализует интерфейс Comparable
. Для сортировки требуется, чтобы заказ выполнялся для типа элемента списка, например. путем реализации Comparable
для класса или предоставления Comparator
sort
.
Сбор myCelebrityList
имеет тип CelebrityNamesFile
, а это значит, что он может принимать только экземпляры этого класса. Вам нужно создать экземпляр CelebrityNamesFile
и добавить его в коллекцию. Collections
не будут принимать вашу коллекцию, потому что класс CelebrityNamesFile
не реализует интерфейс Comparator
. Вам нужно передать экземпляр компаратора в Collections.sort()
в качестве второго параметра.
Для первой проблемы вы пытаетесь добавить String
в экземпляр List<CelebrityNamesFile>
. Вы можете использовать String для создания экземпляра CelebrityNamesFile
и добавить этот экземпляр в ваш список:
CelebrityNamesFile celebrityNamesFile = new CelebrityNamesFile();
celebrityNamesFile.lastName = oneName;
myCelebrityList.add( celebrityNamesFile );
Для второй проблемы попробуйте
Collections.sort(myCelebrityList, new CompareLastName());
Как точки @alyu, класс CelebrityNamesFile
должен реализовать интерфейс Comparable
для работы с кодом, который вы публикуете, но вы также можете добавить экземпляр Comparator<CelebrityNamesFile>
(и у вас уже есть класс CompareLastName
, который его реализует).
Подробнее об этом:
String
(объект oneName
) в список CelebrityNamesFile
s. Вам нужно каким-то образом создать CelebrityNamesFile
из этого String
. Collections.sort()
работает только с объектами Comparable
, если вы явно не передаете компаратор. Попробуйте это вместо: Collections.sort(myCelebrityList, new CelebrityNamesFile.CompareLastName());
Comparator
, реализованный в классе CompareLastName
, может быть помещен вне класса SortNames
или, по крайней мере, вне класса CelebrityNamesFile
. У меня была такая же проблема, пока я не поместил класс, который реализует мой Компаратор вне моего класса объектов. После того, как я это сделал, программа отлично работала. Вот пример моего кода с комментариями, если он помогает.
// Comparator interface for my Word Class.
public interface Comparator<Word>
{
int compare(Word first, Word second);
}
// Word Class, which is my object.
public class Word
{
private String word;
public Word(String input) { word = input; }
public String get() { return word; }
public int wordSize() { return word.length(); }
}
// Comparator implementation is separate from my Word Class.
public class WordComparator implements Comparator<Word>
{
public int compare(Word first, Word second)
{
if (first.wordSize() < second.wordSize()) { return -1; }
else if (first.wordSize() > second.wordSize()) { return 1; }
else { return first.get().compareTo(second.get()); }
}
}
// Now run the program to ensure the Word Class objects and the WordComparator
// Class are implemented correctly.
public class WordComparatorDemo
{
public static void main(String[] args) throws FileNotFoundException
{
ArrayList<Word> list = new ArrayList<Word>();
JFileChooser find = new JFileChooser();
Scanner read = null;
if(find.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
{
File selectedFile = find.getSelectedFile();
read = new Scanner(selectedFile);
try
{
list = inputData(read);
// Here's the sort implementing the WordComparator.
Collections.sort(list, new WordComparator());
}
finally { read.close(); }
}
}
public static ArrayList<Word> inputData(Scanner in)
{
ArrayList<Word> list = new ArrayList<Word>();
in.useDelimiter("[^A-Za-z]+");
while(in.hasNext())
{
String word = in.next();
Word temp = new Word(word);
list.add(temp);
}
return list;
}
}
Примечание. Мой ответ через год после оригинального сообщения, но, надеюсь, он поможет любому, кто заходит на этот сайт для получения помощи.