0

文字列配列リストがあります

[rose,flower,banana,parrot,rose,bird,flower,rose,banana,bird]

この配列から、各重複要素の最後のインデックスが必要です。つまり、インデックスを提供する必要があります

バラ=6 花=5 バナナ=7 鳥=8 オウム=4

重複から最後の要素を取得できるようにします。要素のインデックスを保持したいので、ハッシュメソッドを使用して重複を削除したくありません。この配列をループしようとしましたが、うまくいきません。私のコードは次のとおりです。

for(int i=0;i<ProductName.size();i++){
                String uniquename = null;

                for(int j=0;j<ProductName.size();j++){
                    if(ProductName.get(i).equals(ProductName.get(j))){
                        uniquename=ProductName.get(i);

                    }                                       
                }
                if(uniquename != null){
                    UniqueproductName.add(i,uniquename);

                }
            }

また、結果配列をarraylistとして欲しい

サマーリー :

配列のすべての要素が必要ですが、重複がある場合は、その重複要素の最後のインデックスを取得する必要があります。しかし、ハッシュメソッドを使用したくないだけでなく、結果をArraylist<String>

4

5 に答える 5

2

a が一度だけ発生する場合については言及していませんStringただし、一般的には、のlastIndexOfメソッドを使用できますArrayList

于 2013-01-09T06:41:48.877 に答える
0

a を使用しMap<String, Integer>てインデックスを収集し、このマップから結果を作成します。

public final class Foo
{
    private static final List<String> productList = Arrays.asList(
        "rose", "flower", "banana", "parrot", "rose", "bird", "flower", "rose",
        "banana", "bird"
    );

    private static List<String> indicesFor(final List<String> list)
    {
        final Map<String, Integer> indices = new HashMap<String, Integer>();

        final int size = list.size();

        for (int i = 0; i < size; i++)
            indices.put(list.get(i), i);

        final List<String> ret = new ArrayList<String>(indices.size());
        for (final Map.Entry<String, Integer> entry: indices.entrySet())
            ret.add(entry.toString());
        return ret;
    }

    public static void main(final String... args)
    {
        System.out.println(indicesFor(productList));
        System.exit(0);
    }
}

上記のコードの出力:

[bird=9, banana=8, rose=7, parrot=3, flower=6]
于 2013-01-09T06:44:58.220 に答える
0

セットでこれまでに見たデータを維持しながら、最後から最初に移動できます。

Set<String> set = new HashSet<String>();
for (int i = list.size()-1; i >=0; i--) { 
  if (!set.contains(list.get(i))) {
        System.out.println(list.get(i) + " " + i);
        set.add(list.get(i));
  }
}

O(n)を繰り返し使用してlastIndexOf()いる間、このソリューションの時間の複雑さは平均であることに注意してくださいO(n^2)

于 2013-01-09T06:45:07.063 に答える
0

-ArrayListメソッドを使用しlastIndexOf()ます。

例えば:

public class T4 {

    public static void main(String[] args){

        ArrayList<String> ar = new ArrayList<String>();
        HashMap<String,Integer> ax = new HashMap<String,Integer>();
        int count = 0;

        ar.add("rose");
        ar.add("flower");
        ar.add("flower");
        ar.add("Parrot");
        ar.add("rose");
        ar.add("bird");
        ar.add("flower");
        ar.add("rose");
        ar.add("banana");
        ar.add("bird");

        for(String x : ar){


            ax.put(x,ar.lastIndexOf(x));
        }

        for(Map.Entry<String, Integer> map : ax.entrySet()){

            System.out.println(map.getKey()+"- "+map.getValue());
        }

    }

}
于 2013-01-09T06:49:50.337 に答える
0

このクラスを使用できます:

http://code.google.com/p/synthfuljava/source/browse/trunk/common/org/synthful/util/HashVector.java .

説明は次のとおりです。

http://code.google.com/p/synthfuljava/wiki/HashVector

キーまたは位置の両方で要素にアクセスできるようにするクラスです。

スレッド セーフが重要でない場合は、HashTable を HashMap に、Vector を ArrayList に置き換えて、クラスを書き直す必要があります。

GWT でコンパイルできるようにするために、次のようにしました。

http://code.google.com/p/synthfuljava/source/browse/trunk/gwt/util/org/synthful/gwt/util/HashList.java


実際、このクラスの機能の拡張は、キーを xpath にするハッシュ ツリーを構築するためのフレームワークです。

http://code.google.com/p/synthfuljava/wiki/HashTree

その結果、ハッシュベクターツリーにつながりました:

http://code.google.com/p/synthfuljava/source/browse/trunk/common/org/synthful/util/HashVectorTreeNode.java

これにより、xpath キーまたは階層的な xpath のようなインデックス シーケンスによるアクセスが可能になります。

私が書いたこれらのクラスの実際的な使用はあまり見たことがありませんでしたが、これらの機能を持ついくつかのクラスを作成することは、良い学術的練習になると思いました。ただし、HashVector と HashList は、私が頻繁に使用する十分に活用された/排除されたクラスです。

于 2013-01-09T06:54:41.177 に答える