使用if语句在数组中查找元素

时间:2018-08-31 12:10:35

标签: java arrays

我较早前发表了一篇有关类似主题的文章。但是,我认为我会澄清一些问题并更改我的问题。

所以我正在做的这个项目使我感到困惑。我只有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章是循环/迭代)

https://lms.uwa.edu.au/bbcswebdav/pid-1134902-dt-content-rid-16529804_1/courses/CITS1001_SEM-2_2018/lectures/BooksReadJournal.java.pdf

这是讲师在不使用for循环的情况下使用有关书籍的程序所做的示例。但是,请注意,它具有(int index)作为参数,然后使用String title = bookTitles.get(index)

我的意思是,如何在不使用for循环的情况下做到这一点?我不希望他们有感觉,因为我已经从互联网上抄袭了一些我们没有学到的东西。

谢谢

7 个答案:

答案 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)

  1. Photo上执行Comparable,如果标题相同则返回true。
  2. 构造具有给定类型的临时Photo对象。
  3. 利用ArrayList上的indexOf方法来查找带有照片标题的专辑索引。
  4. 使用get(int)获取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:我无权访问您提出的问题(提供的链接)