Запретить добавлять данные в ArrayList типа Class - PullRequest
0 голосов
/ 05 мая 2020

Как я могу предотвратить добавление дублированных данных в мой ArrayList класса

Когда я добавлю данные в список массивов, он проверит, есть ли дублировать или нет, если да, данные не будут добавляться в ArrayList

I am using this code to prevent the adding of dublicate elements but it's not working 

Код

public class ScrollingActivity extends AppCompatActivity implements AdaptreForRecycler.OnItemClickListener {
private RecyclerView recyclerView;
private AdaptreForRecycler adapter;
private RecyclerView.LayoutManager layoutManager;
private ArrayList<ExampleItem> mExampleList;


private Gson gson;
private String json;
private Type type;

private SharedPreferences sharedPreferences;
private SharedPreferences.Editor editor;


EditText editText;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_scrolling);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);


    loadData();
    buildRecyclerView();

    editText = findViewById(R.id.editText);
    fabButoonClick();


}

public void saveData() {

    sharedPreferences = getSharedPreferences("SHARED_PREFS", MODE_PRIVATE);
    editor = sharedPreferences.edit();
    gson = new Gson();
    json = gson.toJson(mExampleList);

    editor.putString("text", json);
    editor.apply();

}

public void loadData() {

    sharedPreferences = getSharedPreferences("SHARED_PREFS", MODE_PRIVATE);
    gson = new Gson();
    json = sharedPreferences.getString("text", null);
    type = new TypeToken<ArrayList<ExampleItem>>() {
    }.getType();
    mExampleList = gson.fromJson(json, type);

    if (mExampleList == null) {
        mExampleList = new ArrayList<>();
    }

}


public void insertItem(String text) {

    ExampleItem ex = new ExampleItem(text);


    if ( mExampleList.contains(ex)) {
        Toast.makeText(this, "Already Exists", Toast.LENGTH_SHORT).show();
    } else {
        mExampleList.add(ex);
    }

    adapter.notifyDataSetChanged();


}

ExampleItem deletedIndex = null;
ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
        return false;
    }

    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        final int position = viewHolder.getAdapterPosition();
        String name = mExampleList.get(position).getText1();
        deletedIndex = (mExampleList.get(position));
        mExampleList.remove(position);

        sharedPreferences = getSharedPreferences("SHARED_PREFS", MODE_PRIVATE);
        editor = sharedPreferences.edit();
        editor.remove("text");

        saveData();

        editor.apply();
        adapter.notifyItemRemoved(position);

        Snackbar.make(recyclerView, name + " Deleted", Snackbar.LENGTH_LONG)
                .setAction("Undo", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mExampleList.add(position, deletedIndex);
                        adapter.notifyItemInserted(position);

                        saveData();

                    }
                }).show();
    }

    @Override
    public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {

        new RecyclerViewSwipeDecorator.Builder(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)

                .addSwipeLeftBackgroundColor(ContextCompat.getColor(ScrollingActivity.this, R.color.my_background))
                .addSwipeLeftActionIcon(R.drawable.ic_delete_black_24dp)
                .create()
                .decorate();
        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
    }
};


private void buildRecyclerView() {
    recyclerView = findViewById(R.id.recyclerView);
    recyclerView.setHasFixedSize(true);
    layoutManager = new LinearLayoutManager(ScrollingActivity.this);
    adapter = new AdaptreForRecycler(this, mExampleList);

    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setAdapter(adapter);

    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback);
    itemTouchHelper.attachToRecyclerView(recyclerView);

}

public void fabButoonClick() {
    FloatingActionButton fab = findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            AlertDialog.Builder b = new AlertDialog.Builder(ScrollingActivity.this);
            View mview = getLayoutInflater().inflate(R.layout.dialogbox_frontpage, null);

            final EditText editText = mview.findViewById(R.id.editText);
            b.setView(mview);
            b.setTitle("Add subject name");
            b.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });

            b.setPositiveButton("ok", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    String text = editText.getText().toString();

                    if (text.isEmpty()) {
                        Toast.makeText(ScrollingActivity.this, "Please add subject name", Toast.LENGTH_SHORT).show();
                    } else {

                        insertItem(text);

                        saveData();
                    }
                }
            });
            b.setCancelable(false);
            b.show();
        }
    });

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_scrolling, menu);

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();


    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
public void onItemClick(int position) {
    Intent i = new Intent(ScrollingActivity.this, StudentListActivity.class);
    i.putExtra("Subject Name", mExampleList.get(position).getText1());

    startActivity(i);
}

}

Ответы [ 4 ]

0 голосов

Существует довольно простой способ проверить, существует ли элемент в списке:

Переопределить метод equals.

Вам придется переопределить equals внутри вашего ExampleItem класса.

Я не знаю содержимого, ie. код вашего ExampleItem, но это только мое предположение, поэтому я предлагаю вам соответствующим образом изменить свой код.

public class ExampleItem {

    private String text1, text2;

    @Override
    public boolean equals(Object o) {
        // Check if the given Object 'o' is an instance,
        // ie. same class, of this ExampleItem class
        if (o instanceof ExampleItem) {
            // Cast the object to ExampleItem
            ExampleItem other = (ExampleItem) o;

            // Check if both have same text
            // (I'm guessing that you only wanted to
            //   compare the text1 variable, otherwise,
            //   check comment below.)
            // Objects.equals() will evaluate whether
            // both text are the same
            return Objects.equals(this.text1, other.text1); // 'this' is unnecessary, only to show

            // If you want to check both then uncomment
            // the code below and remove the one above
            // return Objects.equals(text1, other.text1) && Objects.equals(text2, other.text2);
        }

        // If above fails then I'll just use the
        // before-overwritten equals to avoid
        // writing myself each tiny bit of
        // its implementation
        return super.equals(o);
    }

    public ExampleItem(String text1) {
        this.text1 = text1;
    }

    public ExampleItem(String text1, String text2) {
        this.text1 = text1;
        this.text2 = text2;
    }

    public String getText1() {
        return text1;
    }

    public void setText1(String t1) {
        text1 = t1;
    }

    public String getText2() {
        return text2;
    }

    public void setText2(String t2) {
        text2 = t2;
    }

}

Метод contains из List тогда будет использовать ваш переопределенный / настраиваемый equals, чтобы сравнить данный элемент с другими элементами в нем.

И все, как в случае с кодом plug-and-play. Теперь вы можете ожидать, что ваш mExampleList.contains(ex) заработает.

И, конечно же, я надеюсь, что он работает, и, как всегда, удачного кодирования!

0 голосов
/ 05 мая 2020

Да, это возможно, вы можете использовать arrayList.contains(val) после сканирования переменной val.

Если это return 1, то print («val уже завершается.») В противном случае

Если это returns 0, то вы можете добавить его в arrayList

Посмотрите, как работает метод .contains ()

Вы также можете использовать метод .indexOf () для узнать позицию. См. Здесь

Чтобы использовать .contains () с объектом, вам необходимо переопределить хэш-код и метод равенства. Смотрите здесь, смотрите комментарии к отмеченному Ответу

0 голосов
/ 05 мая 2020
• 1000 Ниже приведен код ArrayListSet, который вы можете создать самостоятельно.
import java.util.*;

public class ArrayListSet<E> implements Iterable<E>, Set<E> {
    private ArrayList<E> list;
    private HashSet<E> set;

    public ArrayListSet() {
        list = new ArrayList<>();
        set = new HashSet<>();
    }

    public boolean add(E e) {
        return set.add(e) && list.add(e);
    }

    public boolean add(int i, E e) {
        if (!set.add(e)) return false;
        list.add(i, e);
        return true;
    }

    public void clear() {
        list.clear();
        set.clear();
    }

    public boolean contains(Object o) {
        return set.contains(o);
    }

    public E get(int i) {
        return list.get(i);
    }

    public boolean isEmpty() {
        return list.isEmpty();
    }

    public E remove(int i) {        
        E e = list.remove(i);
        set.remove(e);
        return e;
    }

    public boolean remove(Object o) {        
        if (set.remove(o)) {
            list.remove(o);
            return true;
        }

        return false;
    }

    public boolean set(int i, E e) {
        if (set.contains(e)) return false;

        set.add(e);
        set.remove(list.set(i, e));
        return true;
    }

    public int size() {
        return list.size();
    }

    public void sort(Comparator<? super E> c) {
        Collections.sort(list, c);
    }

    public Iterator<E> iterator() {
        return list.iterator();
    }

    public boolean addAll(Collection<? extends E> c) {
        int before = size();
        for (E e : c) add(e);
        return size() == before;
    }

    public boolean containsAll(Collection<?> c) {
        return set.containsAll(c);
    }

    public boolean removeAll(Collection<?> c) {
        return set.removeAll(c) && list.removeAll(c);
    }

    public boolean retainAll(Collection<?> c) {
         return set.retainAll(c) && list.retainAll(c);
    }

    public Object[] toArray() {
        return list.toArray();
    }

    public <T> T[] toArray(T[] a) {
        return list.toArray(a);
    }
}

0 голосов
/ 05 мая 2020

Я предполагаю, что вы хотите предотвратить добавление повторяющихся элементов в ArrayList. Но это не сила ArrayList. Если вы хотите сохранить только уникальные элементы, просто используйте структуру данных HashSet, которая сохранит только уникальные элементы. Но что требует особого внимания, так это то, как вы определяете дубликаты, независимо от того, имеют ли два элемента одинаковое содержимое или у них одинаковый идентификатор (который является одним и тем же объектом).

...