개요
이 예제는 Android 앱에서 LinkedHashSet을 활용해 ArrayList에 저장되는 데이터의 중복을 제거하고, 그 결과를 ListView에 표시하는 방법을 보여줍니다. 사용자가 이름을 입력하면 저장(Save) 버튼을 통해 ArrayList에 데이터가 추가되는데, LinkedHashSet 덕분에 동일한 이름이 여러 번 입력되더라도 목록에는 한 번만 저장됩니다.
1단계: 새 프로젝트 만들기
Android Studio에서 File ⇒ New Project를 선택하여 새 프로젝트를 생성하고, 필요한 모든 정보를 입력합니다.
2단계: 레이아웃 파일 수정
res/layout/activity_main.xml 파일에 다음 코드를 추가합니다.
<?xml version = "1.0" encoding = "utf-8"?> <LinearLayout xmlns:android = "https://schemas.android.com/apk/res/android" xmlns:tools = "https://schemas.android.com/tools" android:layout_width = "match_parent" android:layout_height = "match_parent" tools:context = ".MainActivity" android:orientation = "vertical"> <EditText android:id = "@+id/name" android:layout_width = "match_parent" android:hint = "Enter Name" android:layout_height = "wrap_content" /> <LinearLayout android:layout_width = "wrap_content" android:layout_height = "wrap_content"> <Button android:id = "@+id/save" android:text = "Save" android:layout_width = "wrap_content" android:layout_height = "wrap_content" /> <Button android:id = "@+id/refresh" android:text = "Refresh" android:layout_width = "wrap_content" android:layout_height = "wrap_content" /> </LinearLayout> <ListView android:id = "@+id/listView" android:layout_width = "match_parent" android:layout_height = "wrap_content"> </ListView> </LinearLayout>
위 레이아웃에는 이름을 입력받는 EditText와 두 개의 버튼, 그리고 결과를 보여줄 ListView가 배치되어 있습니다. 사용자가 Save(저장) 버튼을 클릭하면 입력한 데이터가 ArrayList에 저장되고, Refresh(새로고침) 버튼을 클릭하면 ListView의 변경 사항을 화면에 반영할 수 있습니다.
3단계: MainActivity 작성
src/MainActivity.java 파일에 다음 코드를 추가합니다.
package com.example.andy.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.LinkedHashSet;
public class MainActivity extends AppCompatActivity {
Button save, refresh;
EditText name;
ArrayAdapter arrayAdapter;
ArrayList<String>array_list;
private ListView listView;
@Override
protected void onCreate(Bundle readdInstanceState) {
super.onCreate(readdInstanceState);
setContentView(R.layout.activity_main);
array_list = new ArrayList<>();
name = findViewById(R.id.name);
listView = findViewById(R.id.listView);
findViewById(R.id.refresh).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
arrayAdapter.notifyDataSetChanged();
listView.invalidateViews();
listView.refreshDrawableState();
}
});
findViewById(R.id.save).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!name.getText().toString().isEmpty()) {
array_list.add(name.getText().toString());
LinkedHashSet hs = new LinkedHashSet();
hs.addAll(array_list);
array_list.clear();
array_list.addAll(hs);
arrayAdapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, array_list);
listView.setAdapter(arrayAdapter);
Toast.makeText(MainActivity.this, "Inserted", Toast.LENGTH_LONG).show();
} else {
name.setError("Enter NAME");
}
}
});
}
}중복 제거의 핵심 원리
중복 제거를 담당하는 코드는 Save 버튼 클릭 리스너 안의 다음 부분입니다.
LinkedHashSet hs = new LinkedHashSet(); hs.addAll(array_list); array_list.clear(); array_list.addAll(hs);
LinkedHashSet은 Set 인터페이스의 구현체로, 중복된 요소를 허용하지 않으면서도 요소의 삽입 순서를 그대로 유지한다는 특징이 있습니다. 따라서 ArrayList의 전체 내용을 LinkedHashSet에 옮겼다가 다시 ArrayList로 되돌리면, 순서는 유지되면서 중복된 항목만 자동으로 걸러집니다. 또한 입력값이 비어 있을 경우 setError()를 호출해 사용자에게 이름 입력을 요구하는 유효성 검사도 함께 처리하고 있습니다.
앱 실행 및 결과 확인
이제 애플리케이션을 실행해 보겠습니다. 실제 Android 기기가 컴퓨터에 연결되어 있다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤 툴바에서 Run 아이콘을 클릭하고, 실행 옵션에서 본인의 모바일 기기를 선택하세요. 그러면 기기 화면에 앱의 기본 화면이 표시됩니다.

위 실행 결과에서 동일한 이름을 여러 번 입력해도 Toast 메시지는 정상적으로 표시되지만, ArrayList에는 해당 값이 중복 없이 한 번만 저장되는 것을 확인할 수 있습니다. 이처럼 LinkedHashSet을 활용하면 간단한 코드 몇 줄만으로 ListView에 표시할 데이터의 중복을 손쉽게 제거할 수 있습니다.