14

私は Java の初心者です。このテーマに関するトピックをいくつか見つけましたが、どれも役に立ちませんでした。私はこのような配列を持っています:

int[] numbers = {1, 1, 2, 1, 3, 4, 5};

そして、私はこの出力を取得する必要があります:

1, 2, 3, 4, 5

その配列のすべてのアイテムを一度だけ。

しかし、それを取得する方法は?

4

17 に答える 17

13

独自のアルゴリズムを書かない最も簡単な解決策:

Integer[] numbers = {1, 1, 2, 1, 3, 4, 5};
Set<Integer> uniqKeys = new TreeSet<Integer>();
uniqKeys.addAll(Arrays.asList(numbers));
System.out.println("uniqKeys: " + uniqKeys);

値の一意性を保証するインターフェイスを設定します。TreeSet はさらにこの値をソートします。

于 2013-04-01T21:29:52.470 に答える
8

独自の要素を保持しているため、 を使用してSet<Integer>多くの時間を節約できます。Java コレクションのクラスを使用することが許可されていない場合は、配列をソートして一意の要素を数えます。配列を手動で並べ替えるか、 を使用できますArrays#sort

コードを投稿しSet<Integer>ます:

int[] numbers = {1, 1, 2, 1, 3, 4, 5};
Set<Integer> setUniqueNumbers = new LinkedHashSet<Integer>();
for(int x : numbers) {
    setUniqueNumbers.add(x);
}
for(Integer x : setUniqueNumbers) {
    System.out.println(x);
}

LinkedHashSet要素がどのように挿入されたかの順序を維持するため、 Set 実装として使用することを好むことに注意してください。これは、配列が である{2 , 1 , 2}場合、出力は で2, 1あり、 ではないことを意味します1, 2

于 2013-04-01T21:27:56.717 に答える
5

Java 8 では:

    final int[] expected = { 1, 2, 3, 4, 5 };

    final int[] numbers = { 1, 1, 2, 1, 3, 4, 5 };

    final int[] distinct = Arrays.stream(numbers)
        .distinct()
        .toArray();

    Assert.assertArrayEquals(Arrays.toString(distinct), expected, distinct);

    final int[] unorderedNumbers = { 5, 1, 2, 1, 4, 3, 5 };

    final int[] distinctOrdered = Arrays.stream(unorderedNumbers)
        .sorted()
        .distinct()
        .toArray();

    Assert.assertArrayEquals(Arrays.toString(distinctOrdered), expected, distinctOrdered);
于 2014-07-17T13:32:11.020 に答える
3
//Running total of distinct integers found
int distinctIntegers = 0;

for (int j = 0; j < array.length; j++)
{
    //Get the next integer to check
    int thisInt = array[j];

    //Check if we've seen it before (by checking all array indexes below j)
    boolean seenThisIntBefore = false;
    for (int i = 0; i < j; i++)
    {
        if (thisInt == array[i])
        {
            seenThisIntBefore = true;
        }
    }

    //If we have not seen the integer before, increment the running total of distinct integers
    if (!seenThisIntBefore)
    {
        distinctIntegers++;
    }
}
于 2013-04-04T21:13:12.233 に答える
2
public class Practice {
    public static void main(String[] args) {
        List<Integer> list = new LinkedList<>(Arrays.asList(3,7,3,-1,2,3,7,2,15,15));
        countUnique(list);
}

public static void countUnique(List<Integer> list){
    Collections.sort(list);
    Set<Integer> uniqueNumbers = new HashSet<Integer>(list);
    System.out.println(uniqueNumbers.size());
}

}

于 2016-06-09T00:58:39.840 に答える
1

個別のリストを取得する簡単な方法があります。

Integer[] intArray = {1,2,3,0,0,2,4,0,2,5,2};
List<Integer> intList = Arrays.asList(intArray);          //To List
intList = new ArrayList<>(new LinkedHashSet<>(intList));  //Distinct
Collections.sort(intList);                                //Optional Sort
intArray = intList.toArray(new Integer[0]);               //Back to array

出力:

1 2 3 0 0 2 4 0 2 5 2   //Array
1 2 3 0 0 2 4 0 2 5 2   //List
1 2 3 0 4 5             //Distinct List
0 1 2 3 4 5             //Distinct Sorted List
0 1 2 3 4 5             //Distinct Sorted Array

jDoodle の例を参照してください

于 2019-08-07T07:17:03.793 に答える
0

一意のデータを見つけるには:

public class Uniquedata 
 {
 public static void main(String[] args) 
  {
int c=0;

String s1[]={"hello","hi","j2ee","j2ee","sql","jdbc","hello","jdbc","hybernet","j2ee","hello","hello","hybernet"};

for(int i=0;i<s1.length;i++)
{
    for(int j=i+1;j<s1.length;j++)
    {
    if(s1[i]==(s1[j]) )
    {
        c++;
        s1[j]="";
    }}
        if(c==0)
        {
            System.out.println(s1[i]);
        }
            else
            {
                s1[i]="";
            c=0;    
            }
        }
    }
}
于 2016-06-05T17:42:24.913 に答える
0

あなたが使用することができます

Object[] array = new HashSet<>(Arrays.asList(numbers)).toArray();
于 2017-01-10T19:50:32.370 に答える
0

問題をまだ解決しているかどうかはわかりませんが、私のコードは次のようになります。

    int[] numbers = {1, 1, 2, 1, 3, 4, 5};
    int x = numbers.length;
    int[] unique = new int[x];
    int p = 0;
    for(int i = 0; i < x; i++)
    {
        int temp = numbers[i];
        int b = 0;
        for(int y = 0; y < x; y++)
        {
            if(unique[y] != temp)
            {
               b++;
            }
        }
        if(b == x)
        {
            unique[p] = temp;
            p++;
        }
    }
    for(int a = 0; a < p; a++)
    {
        System.out.print(unique[a]);
        if(a < p-1)
        {
            System.out.print(", ");
        }
    }
于 2013-04-04T21:06:23.303 に答える
0

次のようにできます。

    int[] numbers = {1, 1, 2, 1, 3, 4, 5};
    ArrayList<Integer> store = new ArrayList<Integer>(); // so the size can vary

    for (int n = 0; n < numbers.length; n++){
        if (!store.contains(numbers[n])){ // if numbers[n] is not in store, then add it
            store.add(numbers[n]);
        }
    }
    numbers = new int[store.size()];
    for (int n = 0; n < store.size(); n++){
        numbers[n] = store.get(n);
    }

整数と整数は (ほぼ) 互換的に使用できます。このコードは、配列の「数字」を取得し、重複する数字がすべて失われるように変更します。並べ替えたい場合は、Collections.sort(store);前に追加できますnumbers = new int[store.size()]

于 2013-04-01T22:13:54.000 に答える