尝试在Java中的ArrayList实现中查找唯一元素。一个getUnique方法

时间:2017-02-08 06:04:20

标签: java arrays arraylist

public class MyArrayList<T> implements MyList<T>{
    int num;        //number of things in the list
    T[] vals;       //to store the contents

    @SuppressWarnings("unchecked")
    public MyArrayList() {
        num = 0;
        vals = (T[]) new Object[3];
    }

public T getUnique(){
        T distinct = null;
        int count = 0;
        for (int i=0; i<vals.length; i++){
            distinct =  vals[i];
            for (int j = 0; j<vals.length; j++){
                if (vals[j] == vals[i]){
                    count++;
                }
                if (count == 1){
                    return distinct;
                }
            }
        }
        if (distinct == null){
            throw new IllegalArgumentException();
        }
        return distinct;
    }

我正在尝试使用获取唯一方法。一个方法getUnique,它不接受任何参数,并返回列表中仅出现一次的第一个值。 (例如,调用列表[1,2,3,1,2,4]上的方法将从1和1开始返回3 2都出现不止一次。)如果列表为空或其所有值出现多次,则该方法抛出NoSuchElementException

2 个答案:

答案 0 :(得分:1)

我在你的代码中添加了一些FIXME:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout   xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
    android:id="@+id/web"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</WebView>

答案 1 :(得分:0)

帕特里克帕克的建议将修复你的代码,但我想提供一个更清晰,更快速的解决方案来解决在列表中查找唯一元素的问题。此算法及时运行O(n)而不是O(n^2)

public static <T> Optional<T> getUnique(List<T> ls) {
    // Create a map whose keys are elements of the list and whose values are
    // lists of their occurences. E.g. [1,2,3,1,2,4] becomes {1->[1, 1],
    // 2->[2, 2], 3->[3], 4->[4]}. Then elements.get(x).size() tells us how
    // many times x occured in ls.
    Map<T, List<T>> elements = ls.stream()
            .collect(Collectors.groupingBy(x -> x));
    // Find the first element that occurs exactly one time in ls.
    return ls.stream().filter(x -> elements.get(x).size() == 1)
            .findFirst();
}

您可以这样称呼它:

Integer[] vals = {1,2,3,1,2,4};
System.out.println(getUnique(Arrays.asList(vals))
        .orElseThrow(NoSuchElementException::new));

此代码使用Java 8流和Optional。下面是不使用Java 8语言功能的同一算法的另一种实现方式;如果您从未遇到过流,您可能会发现它更容易理解。

private static <T> T getUnique(List<T> arr) {
    Map<T, Integer> numOccurrences = new HashMap<>();
    for (T item : arr) {
        numOccurrences.put(item, 1 + numOccurrences.getOrDefault(item, 0));
    }

    for (T item : arr) {
        if (numOccurrences.get(item) == 1) {
            return item;
        }
    }

    throw new NoSuchElementException();
}