変数として分類されるものは少しあいまいです (整数とイテレータは変数だと思いますが、他のほとんどの回答は同意しないようです)。宣言が必要なもの、つまり単一のステートメント (整数、イテレータ) の範囲を超えていると仮定します。 、要素、何でも)(したがってget(i).equals(...)
、変数として分類せずに行うことができますが、そうするとvar = get(i); var.equals(...)
、それは変数になります)。
以下は、繰り返される要素が互いに続くと仮定し、重複を正確に 2 回の出現として分類します。4 回のオカレンスは 2 組の重複として分類され、6 回のオカレンスは 3 組として分類されます。
static String findUnique(Iterable<String> collection)
{
Iterator<String> iterator = collection.iterator();
while (iterator.hasNext())
{
String s = iterator.next();
if (!iterator.hasNext() || !s.equals(iterator.next()))
return s;
}
return null;
}
以下を使用して実行できます。
List<String> myList = Arrays.asList("abcd", "xyz", "xyz", "pqrs", "pqrs");
System.out.println(findUnique(myList));
技術的s
には別の変数ですが、反復に対してローカルであるため、問題ない可能性があります。それ以外の場合は、関数を変更Iterator
して追加すると、if ステートメントをgetNextWithoutIncrement()
削除して次のように変更できます。s
if (!iterator.getNextWithoutIncrement().hasNext() ||
iterator.next().equals(iterator.next()))
繰り返される要素が互いに続かない場合、これは少し問題です。私が知っているすべてのソート アルゴリズムは、1 つ以上の変数を使用します (バブル ソートでさえ、2 つの変数で行われます)。ただし、リストの変更が許可されている場合は、次のように変更されたバブル ソートのようなプロセスを使用できます。
static String findUnique(List<String> collection)
{
while (collection.size() > 0)
{
int i;
for (i = 0; i < collection.size()-1; i++)
if (collection.get(i).equals(collection.get(i+1)))
break;
else
{
String s = collection.get(i);
collection.set(i,collection.get(i+1));
collection.set(i+1,s);
}
if (i == collection.size()-1)
return collection.get(collection.size()-1);
else
{
collection.remove(i);
collection.remove(i);
}
}
return null;
}
電話:
List<String> myList= new ArrayList<String>(Arrays.asList("xyz", "abcd", "xyz", "pqrs", "pqrs"));
System.out.println(findUnique(myList));
今remove
は無理かもしれませんが、機能を追加しi
たものに変更すればできるはずです。Iterator
getNextWithoutIncrement
またs
別の変数ですが、これも反復に対してローカルであるため、問題ない可能性があります。これは swap のちょっとしたハックな代替手段です (文字列に が含まれていないと仮定します|
):
collection.set(i, collection.get(i+1) + "|" + collection.get(i));
collection.set(i+1, collection.get(i).substring(collection.get(i).indexOf("|") + 1));
collection.set(i, collection.get(i).substring(0, collection.get(i).indexOf("|")));