ArrayList 정렬하는 방법

|

오름차순 정렬 예제

다음 예제는 숫자를 오름차순으로 정렬하는 예제입니다.

List<Integer> list = new ArrayList<>();

list.add(5);
list.add(3);
list.add(7);
list.add(6);
list.add(10);
list.add(4);

Collections.sort(list, new Comparator<Integer>() {
  @Override
  public int compare(Integer o1, Integer o2) {
    if (o1 < o2) {
      return -1;
    } else if (o1 > o2) {
      return 1;
    }
    return 0;
  }
});

for (int i = 0; i < list.size(); i++) {
  System.out.println(list.get(i));
}


수정된 버전 1

데이터 타입이 단순한 Integer 형태이기 때문에 비교하는 구문을 아래와 같이 수정할 수도 있습니다.

List<Integer> list = new ArrayList<>();

list.add(5);
list.add(3);
list.add(7);
list.add(6);
list.add(10);
list.add(4);

Collections.sort(list, new Comparator<Integer>() {
  @Override
  public int compare(Integer o1, Integer o2) {
    return (o1 - o2);
  }
});

for (int i = 0; i < list.size(); i++) {
  System.out.println(list.get(i));
}


수정된 버전 2

또한 Java에서 제공하는 대부분의 데이터 타입들은 compareTo 인터페이스를 구현해놓았기 때문에 아래와 같은 코드도 사용가능합니다.

List<Integer> list = new ArrayList<>();

list.add(5);
list.add(3);
list.add(7);
list.add(6);
list.add(10);
list.add(4);

Collections.sort(list, new Comparator<Integer>() {
  @Override
  public int compare(Integer o1, Integer o2) {
    return o1.compareTo(o2);
  }
});

for (int i = 0; i < list.size(); i++) {
  System.out.println(list.get(i));
}


Comparable 인터페이스 구현

가장 간편한건 아래의 예제와 같이 Comparable 인터페이스를 구현하는 방법입니다.

public class Data implements Comparable {

  private final int value;

  public Data(int value) {
    this.value = value;
  }

  public final int getValue() {
    return this.value;
  }

  @Override
  public int compareTo(Object o) {
    return getValue() - ((Data) o).getValue();
  }
}

이 경우는 아래와 같이 Collections.sort() 메소드에 별도의 매개변수없이 간편하게 정렬을 할 수 있습니다.

List<Data> list = new ArrayList<>();

list.add(new Data(3));
list.add(new Data(5));
list.add(new Data(4));
list.add(new Data(2));

Collections.sort(list);


파일명으로 오름 차순 정렬 예제

  public void refresh(String path) {
    mList.clear();
    File directory = new File(path);
    File[] files = directory.listFiles();

    for (int i = 0; i < files.length; i++) {
      mList.add(files[i]);
    }

    Comparator<File> cmpAsc = (o1, o2) -> o1.getName().compareTo(o2.getName());
    Collections.sort(mList, cmpAsc);

    notifyDataSetChanged();
  }


Child Node 각도에 따라 정렬하는 예제

각도는 12시 방향을 원점으로 해서 반시계 방향으로 구했습니다.

  void sort() {
    Collections.sort(childList, (o1, o2) -> {

      int px = left() + width() / 2;
      int py = top + height() / 2;

      int cx1 = o1.left() + o1.width() / 2;
      int cy1 = o1.top() + o1.height() / 2;

      int cx2 = o2.left() + o2.width() / 2;
      int cy2 = o2.top() + o2.height() / 2;

      int dx1 = cx1 - px;
      int dy1 = cy1 - py;

      int dx2 = cx2 - px;
      int dy2 = cy2 - py;

      double degree1 = Math.atan2(dx1, dy1);
      double degree2 = Math.atan2(dx2, dy2);

      if (degree1 < degree2) {
        return -1;
      } else if (degree1 > degree2) {
        return 1;
      } else {
        return 0;
      }
    });
  }

Fragment 추가 및 삭제 예제

|
void addLogViewerFragment() {
  logViewerFragment = new LogViewerFragment();
  FragmentManager fragmentManager = getSupportFragmentManager();
  FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
  fragmentTransaction.add(R.id.logviewer_layout, logViewerFragment).commit();
}
  
void removeLogviewerFragment() {
  FragmentManager fragmentManager = getSupportFragmentManager();
  FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
  fragmentTransaction.remove(logViewerFragment).commit();
  logViewerFragment = null;
}

apk 빌드시 CPU 타입(arm64-v8a, armeabi-v7a, x86, x86_64 등)에 따라 분리해서 빌드하는 방법

|

apk를 빌드할 때 모든 CPU 타입이 아닌, 원하는 타입에 대한 바이너리만 빌드할 수 있게 해주는 build.gradle 설정입니다. 전체 apk 용량도 줄어들기 떄문에 빌드 및 설치 시간도 단축이 됩니다.


build.gradle

프로젝트가 아닌 모듈의 build.gradle 파일 설정입니다.

android {
    
    ...

    splits {
        abi {
            enable true
            reset()
            include "arm64-v8a", "armeabi-v7a"
            universalApk false
        }
    }
}

apt 목록 제거하기

|

apt 목록 제거

여러 프로그램들을 설치하다보면 apt update 목록에 원하지도 않는 목록들이 추가되서 너덜너덜해지는 경우가 생깁니다. 그 중에 어떤 목록은 더 이상 유효하지 않아서 지우고 싶은 경우도 생기구요.

/etc/apt 위치에 가면 해당 서버들의 리스트를 가져올 수 있습니다.

gRPC(C++) 설치 방법

|

gRPC 설치 방법

Ubuntu 18.04 기준 C++용 gRPC 설치 방법입니다. 다른 언어에 비해 설치 방법이 조금 더 까다롭습니다.


필요 패키지 설치

sudo apt-get install build-essential autoconf libtool pkg-config
sudo apt-get install libgflags-dev libgtest-dev
sudo apt-get install clang-5.0 libc++-dev
sudo apt-get install libunwind-dev
sudo apt-get install golang


CMake 업데이트

오래된 버전의 cmake 명령어로는 gRPC 설치가 완벽하게 되지 않을 수 있습니다. 특히, /usr/local/lib/cmake/grpc/gRPCTargets.cmake 파일이 생성되지 않아서 혼이 난 적이 있습니다.

여기에서 cmake를 최신 버전으로 설치합시다.

tar -zxvf cmake-3.16.5.tar.gz

cd cmake-3.16.5
./bootstrap
make -j 8
sudo make install


gRPC 소스 다운로드

git clone -b $(curl -L http://grpc.io/release) https://github.com/grpc/grpc

cd grpc/
git submodule update --init

mkdir -p cmake/build
cd cmake/build
cmake ../..
make -j 8
sudo make install


참고

  • https://github.com/grpc/grpc/blob/master/src/cpp/README.md#make
  • https://github.com/grpc/grpc/blob/master/BUILDING.md