我较早前发表了一篇有关类似主题的文章。但是,我认为我会澄清一些问题并更改我的问题。
所以我正在做的这个项目使我感到困惑。我只有5周的时间,问题是要我创建一种方法,该方法以一系列照片的形式返回照片的标题。每张照片都有标题。这是代码:
public class Album {
private String albumtitle;
private ArrayList<Photo> photos;
/**
* This constructor should initialize the
* instance variables of the class.
*/
public Album(String title) {
this.albumtitle = title;
photos = new ArrayList<>();
}
/** When passed a title, this method should
* return the first Photo object in the album with
* a matching title. If there is no such object, it
* should return null.
*
* @param title A title to search for
* @return A Photo object, or null
*/
public Photo searchByTitle(String title) {
//TODO enter code here
}
}
现在,我的讲师说不要使用循环,因为该项目是从第1章到第4章(第5章是循环/迭代)
这是讲师在不使用for循环的情况下使用有关书籍的程序所做的示例。但是,请注意,它具有(int index)
作为参数,然后使用String title = bookTitles.get(index)
我的意思是,如何在不使用for循环的情况下做到这一点?我不希望他们有感觉,因为我已经从互联网上抄袭了一些我们没有学到的东西。
谢谢
答案 0 :(得分:3)
如果您被限制避免使用for-loop
而仅使用if-else
,则可以使用递归调用:
public Photo searchByTitle(String title) {
return searchByIndex(title, 0);
}
private Photo searchByIndex(String title, int index) {
if (index < photos.size()) { // Has next? If yes ...
Photo next = photos.get(index); // Get next
if (!title.equals(next.getPhotoName())) { // Does the title match? If not...
return searchByIndex(title, ++index); // Check the next one
} else return next; // Otherwise you found it
} return null; // ... if no next, return null
}
我假设Photo
类具有一个String photoName
字段,该字段可以被将与String title
进行比较的吸气剂访问。
答案 1 :(得分:2)
Photo
上执行Comparable,如果标题相同则返回true。Photo
对象。Album
。答案 2 :(得分:1)
我已经通过上面的注释实现了代码。
这里的想法是在searchByTitle
方法中构建一个临时对象,并将其传递给具有Photo
类的List.indexOf
方法,该类将覆盖Object.equals
。
>
public class Album {
class Photo {
private String title;
public Photo(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
@Override
public boolean equals(Object anObject) {
return title.equals(((Photo)anObject).getTitle());
}
}
private String albumtitle;
private ArrayList<Photo> photos;
/**
* This constructor should initialize the
* instance variables of the class.
*/
public Album(String title) {
this.albumtitle = title;
photos = new ArrayList<>();
}
/** When passed a title, this method should
* return the first Photo object in the album with
* a matching title. If there is no such object, it
* should return null.
*
* @param title A title to search for
* @return A Photo object, or null
*/
public Photo searchByTitle(String title) {
Photo tmp = new Photo(title);
int index = photos.indexOf(tmp);
if (index >= 0)
return photos.get(index);
return null;
}
}
这是equals
的非常基本的实现,没有考虑null
参数及其类型。
答案 3 :(得分:0)
只是因为我喜欢递归的想法,但是在index
上对List
进行搜索时使用它并不是最佳选择,所以让我们使用迭代器。递归方法将简单地检查是否要取一个值,然后再次检查并调用,直到找到该值或到达末尾为止。
//Just hide the used of an iterator
public static Photo getFirstWithTitle(List<Photo> list, String value){
return getFirstWithTitle(list.iterator(), value);
}
//recursive method
private static Photo getFirstWithTitle(Iterator<Photo> it, String value){
if(it.hasNext()){
Photo p = it.next();
return p.getTitle().equals(value)?
p
: getFirstWithTitle(it, value);
} else
return null;
}
答案 4 :(得分:0)
您可以带来另一个String ArrayList,它保留照片标题的名称。然后在搜索功能中使用字符串arrayList中的照片标题进行搜索。如果找到索引,则按相同顺序插入两个arrayList中,然后从photoTitles返回该索引的Photo对象。
public class Album {
private String albumtitle;
private ArrayList<Photo> photos;
private ArrayList<String> photoTitles;
public Album(String title) {
this.albumtitle = title;
photos = new ArrayList<>();
photoTitles = new ArrayList<>();
}
public Photo searchByTitle(String title) {
int index = photoTitles.indexOf(title);
if(index >= 0) {
return photos.get(index);
}
return null;
}
}
答案 5 :(得分:-1)
您可以使用内置的binarySearch和比较器。可能是最优雅的方式以及我通常的操作方式
public Photo searchByTitle(String title) {
Photo item = null
Comparator<Photo> comparator = new Comparator<Photo>() {
public int compare(Photo it1, Photo it2) {
return it1.getTitle().compareTo(it2.getTitle());
}
};
Collections.sort(photos, comparator); //This should go after you set the items, ie. you sort it once
int index = Collections.binarySearch(photos, comparator);
if (index >= 0) {
item = photos.get(index);
}
return item
}
答案 6 :(得分:-2)
使用Java,您甚至不需要'if'语句。这可以通过以下方式实现:
public Photo searchByTitle(String title) {
return photos.stream().filter(photo -> title.
equals(photo.getTitle())).findAny().get();
}
p.s:我无权访问您提出的问题(提供的链接)