0

クラスに3つのフィールドを持つ、リンクリストに保存されるクラスを作成しました。これらのフィールドの 1 つは、リンクされたリストで検索したい文字列です。

LinkedList
      Obj1
          String name = "first";
          int age = 2;
          int size = 4;
      Obj2
          String name = "second";
          int age = 3;
          int size = 6;
      Obj3
          String name = "third";
          int age = 5;
          int size = 8;

これが指定されたフィールドを持つこれら 3 つのオブジェクトを格納するリンクリストである場合、「second」という名前のオブジェクトのリンク リストを検索する方法はありますか?

4

5 に答える 5

2

リスト内のアイテムを繰り返し検索できます

// Iterate over each object within the list
for(YourClass obj : yourLinkedList) {

    // Check if the object's name matches the criteria, in this case, the name
    // of the object has to match "second"
    if (obj.name.equals("second")) {

        // If we are within this block, it means that we found the object that has
        // its name set as "second".
        return obj;
    }
}

物事をよりエレガントにする方法を作ることもできます

public YourClass findByName(String name) {
    for(YourClass obj : yourLinkedList) {
        if (obj.name.equals(name)) {
            return obj;
        }
    }
    return null;
}

そして、次のように使用します

YourClass object = findByName("second");
于 2013-04-04T04:55:02.543 に答える
1

java.util.Compratorインターフェースを見てください。List を反復処理し、コンパレータを使用して探しているものを見つけるメソッドを作成できます。

次のようなもの(コンパイルされていません):

for(final T value : list)
{
    if(comparator.compare(value, desired) == 0)
    {
        // match
    }
}

コンパレーターでは、必要な比較を実行します。

これが実際の例です:

public class JavaApplication4 
{
    public static void main(String[] args) 
    {
        final List<Data> list;
        final List<Data> a;
        final List<Data> b;

        list = new ArrayList<Data>();
        list.add(new Data("Foo", 1));
        list.add(new Data("Bar", 10));
        list.add(new Data("Car", 10));

        a = find(list, 
                 new Data("Bar", 0),
                 new Comparator<Data>()
                 {
                    @Override
                    public int compare(final Data o1, 
                                       final Data o2) 
                    { 
                        return (o1.name.compareTo(o2.name));
                    }                  
                 });

        b = find(list, 
                 new Data(null, 10),
                 new Comparator<Data>()
                 {
                    @Override
                    public int compare(final Data o1, 
                                       final Data o2) 
                    { 
                        return (o1.count - o2.count);
                    }                  
                 });

        System.out.println(a.size());
        System.out.println(b.size());
    }

    private static List<Data> find(final List<Data>       list,
                                   final Data             desired,
                                   final Comparator<Data> comprator)
    {
        final List<Data> results;

        results = new ArrayList(list.size());

        for(final Data data : list)
        {
            if(comprator.compare(desired, data) == 0)
            {
                results.add(data);
            }
        }

        return (results);
    }

    private static class Data
    {
        private final String name;
        private final int count;

        Data(final String nm,
             final int    c)
        {
            name  = nm;
            count = c;
        }
    }
}

そして、これがfindメソッドの一般的なバージョンです。このメソッドを使用すると、find メソッドを再度記述する必要はありません。反復コードにマッチングのロジックを埋め込むメソッドを使用すると、マッチング ロジックの新しいセットごとに反復ロジックを書き直す必要があります。

private static <T> List<T> find(final List<T>       list,
                                final T             desired,
                                final Comparator<T> comprator)
{
    final List<T> results;

    results = new ArrayList(list.size());

    for(final T value : list)
    {
        if(comprator.compare(desired, value) == 0)
        {
            results.add(value);
        }
    }

    return (results);
}
于 2013-04-04T04:56:31.853 に答える
1

これを行う最も簡単な方法は、もちろん、コレクション内の各要素を繰り返し処理し、フィルター条件に一致するかどうかを確認し、見つかった一致を選択することです。ただし、これは何度も実行する必要があり、フィルター条件が複雑になるほど面倒になります。タスクを効率的に完了するために、既存のライブラリを利用することをお勧めします。Google-Collectionsを使用した例を次に示します。

final List<SomeObj> listObjs = Arrays.asList(
        new SomeObj("first", 2, 4), new SomeObj("second", 3, 6),
        new SomeObj("third", 5, 8));

final Iterable<SomeObj> filtered = Iterables.filter(listObjs,
        new Predicate<SomeObj>() {

            @Override
            public boolean apply(final SomeObj obj) {
                return "second".equals(obj.getName());
            }
        });

for (final SomeObj obj : filtered) {
    System.out.println(obj);
}

示されているコードは、「second」という name プロパティを持つリスト内のすべてのオブジェクトを選択します。明らかに、述語は匿名の内部クラスである必要はありません。再利用する必要がある場合は、スタンドアロン クラスに分割するだけです。

于 2013-04-04T05:28:25.263 に答える
0

あなたはそれを通過してそれを成し遂げることができます、または別の方法があります.

クラスの equals メソッド (および hashcode メソッドも) をオーバーライドする必要があります。

必要に応じて equals をオーバーライドした後、この場合は名前を比較して、同じ名前の新しいオブジェクトを作成し、LinkedList の remove(Object o) メソッドを呼び出して、オブジェクトを取得します。

このアプローチでは、オブジェクトの等価性が名前で定義され、エントリが LinkedList から削除されることに注意してください。

于 2013-04-04T04:59:13.283 に答える