Для получения полного доступа
зарегистрируйтесь.

Раздел:
Подраздел:
Языки:


Сниппет,  Java

CAS Singleton

Gravatar image
Nikita Eshkeev
  • Репутация: 9
  • Сниппеты: 1
  • Ревизии: 0

Lock-free and wait-free Singleton

package concurrency;

import java.util.concurrent.atomic.AtomicReference;

public class Singleton {
	
	private static AtomicReference<Singleton> instance;

	private Singleton() {
		instance = new AtomicReference<>();
	}
	
	public static Singleton getInstance() {
		if (instance == null) {
			Singleton s = new Singleton();
			instance.compareAndSet(null, s);
		}
		return instance.get();
	}
}

Gravatar image
Semyon Danilov
  • Репутация: 5
  • Сниппеты: 1
  • Ревизии: 0

Для тех, кому надоело постоянно кастовать

public class BaseActivity extends AppCompatActivity {

    public <T extends View> T findViewWithId(final int id) {
        return (T) super.findViewById(id);
    }

}
Gravatar image
fretheo
  • Репутация: 7
  • Сниппеты: 3
  • Ревизии: 0

Pipeline собственно для лямбд. Для него здесь вместо | использован /. Класс PV вообще можно использовать и для одного аргумента, но тогда на выходе у него будет массив с одним элементом соответвенно. Код без проблем компилируется как в Java-классы так и в Javascript.

Пример использования:


    P(1.0) / {it + 3} / {it - 2} / {it * 5} / {println(it)}
    PV(1, 2, 3) / {it + 3} / {it - 2} / {it * 7} / {println(it)}

Реализация на Kotlin, который на момент публикации отсутствовал среди доступных языков.

Запустить можно здесь

Upd: еще немного упростил реализацию

// Pipeline with one argument
class P<A> (val v: A) {
    inline fun <B> div(op: (A) -> B) = P(op(v))
}

// Pipeline with multiple arguments
class PV<A> (vararg val v: A) {
    inline fun <reified B> div(op: (A) -> B) = PV(*array(v.map{op(it)}))
    inline fun <reified T> array(col: List<T>) = Array<T>(col.size()){col[it]}    
}
Gravatar image
ancain
  • Репутация: 3
  • Сниппеты: 1
  • Ревизии: 0

Вычисление определителя квадратной матрицы с выбором главного элемента по столбцу

public static double det(double[][] A) {
		double res = 1, tmp;
		for (int i = 0, index = 0; i < A.length; index = ++i) {
			for (int j = i + 1; j < A.length; ++j)
				if (Math.abs(A[j][i]) > Math.abs(A[index][i]))
					index = j;
			if (Math.abs(A[index][i]) <= 0.0) return 0.;
			if (index != i) res *= -1;
			for (int j = i; j < A.length; ++j) {
				tmp = A[index][j];
				A[index][j] = A[i][j];
				A[i][j] = tmp;}
			for (int j = i + 1; j < A.length; ++j) {
				tmp = A[j][i] / A[i][i];
				for (int k = i; k < A.length; ++k)
					A[j][k] -= tmp * A[i][k];}
			res *= A[i][i];}
		return res;}
Gravatar image
degree
  • Репутация: 2
  • Сниппеты: 1
  • Ревизии: 0

Используя O(1) по памяти находится возможное начало цикла в односвязном списке.

Соль решения в том, чтобы заставить 2 указателя бегать с разной скоростью. Как только один догоняет другой -- значит есть цикл. Если аккуратно посчитать, то пробежав еще с одинаковой скоростью от начала списка и с места встречи, новое место встречи будет началом цикла.

Полное описание задачи: https://leetcode.com/problems/linked-list-cycle-ii/

	public ListNode detectCycle(ListNode head) {
		if (head == null || head.next == null) return null;
		else if (head.next == head) return head;
		ListNode p1 = head, p2 = head;
		while (p2 != null) {
			p1 = p1.next;
			p2 = p2.next;
			if (p2 != null) p2 = p2.next;
			if (p1 == p2) break;
		}
		if (p2 == null) return null;
		while (head != p2) {
			head = head.next;
			p2 = p2.next;
		}
		return head;
	}

Gravatar image
fretheo
  • Репутация: 7
  • Сниппеты: 3
  • Ревизии: 0

Один из комбинаторов неподвижной точки.

Реализация на Kotlin, который на момент публикации отсутствовал среди доступных языков.

Запустить можно здесь

class Main <A, B> {
    val Y = { f: ((A)->B) -> (A)->B ->
        class R(val rf: (R) -> (A)->B) {
            fun invoke(r: R) = rf(r)
        }
        val g = { r: R -> f({ arg -> r(r)(arg) }) }
        g(R(g))
    }
}

fun Main<Int, Int>.run() {
    val factorial = Y({ f -> { n -> if (n <= 0) 1 else f(n - 1) * n } })
    val fibonacci = Y({ f -> { n -> if (n < 2) n else f(n - 1) + f(n - 2) } })
    println(1..10 map { factorial(it) })
    println(1..10 map { fibonacci(it) })
}

fun main(args: Array<String>) = Main<Int, Int>().run()
Сниппет,  Java

Convert Currency To Rouble

Gravatar image
Barefooter
  • Репутация: 5
  • Сниппеты: 2
  • Ревизии: 0

Конвертирует число денег в произвольной валюте в значение в рублях по курсу Центрального банка России.

    public static double convertCurrencyToRouble(double sourceMoney, String sourceCurrency) throws InterruptedException {
        String page = Utils.fetch(httpClient, "http://www.cbr.ru/scripts/XML_daily.asp", "windows-1251");
        TagNode rootNode = htmlCleaner.clean(page);
        String xpath = ".//ValCurs/Valute/CharCode[text() = '" + sourceCurrency + "']";
        TagNode charCodeNode = Utils.getFirstTagNode(rootNode, xpath);
        if (charCodeNode == null) {
            return sourceMoney;
        } else {
            TagNode valuteNode = charCodeNode.getParent();
            TagNode valueNode = Utils.getFirstTagNode(valuteNode, ".//Value");
            String valueText = HtmlCleanerUtils.getText(valueNode);
            valueText = valueText.replace(",", ".");
            double value = Double.parseDouble(valueText);
            return value * sourceMoney;
        }
    }
Gravatar image
ocsy
  • Репутация: 1
  • Сниппеты: 1
  • Ревизии: 0

Hook для OSGI Framework на базе Eclipse Equinox. Используется например для построения orm.xml из кусочков, которые содержатся во фрагментах для хостовой бандлы. Таким хуком можно например собрать orm файл из фрагментов, которые хранятся в других фрагмент-бандлах, при этом фрагменты могут разрабатывать изолирование группы разработчиков.

 public BundleFileWrapper wrapBundleFile(BundleFile bundleFile, Generation generation, boolean base) {
        try {
            BundleEntry entry = bundleFile.getEntry("/META-INF/MANIFEST.MF");
            if (entry != null) {
                Manifest manifest = new Manifest(entry.getInputStream());
                String bundleSymbolicName = manifest.getMainAttributes().getValue("Bundle-SymbolicName");
                if (bundleSymbolicName != null) {
                    bundleSymbolicName = bundleSymbolicName.split(";")[0];
                    if (bundleSymbolicName.equals(System.getProperty("orm-host-bundle-symbolic-name"))) {
                        return new OrmBundleFileWrapper(bundleFile, generation.getBundleInfo().getBundleId());
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
 }
Gravatar image
fretheo
  • Репутация: 7
  • Сниппеты: 3
  • Ревизии: 0

Реализация на Kotlin, который на момент публикации отсутствовал среди доступных языков.

Upd: Еще сильнее ужата реализация. Здесь можно посмотреть на простой примерчик

import java.util.*

open class Node (var visited : Boolean = false, 
                 val links : MutableList<Node> = LinkedList<Node>())

class Path(var initial : Node, val steps: Stack<Node> = Stack<Node>()) {
  fun visit(nextStep : Node, operation : () -> Any) { steps.push(nextStep).visited = true
                                                      operation()
                                                      steps.pop().visited = false }
  fun copy() = Path(initial, steps.clone() as Stack<Node>)
}

class Search(val initial: Node, val target: Node) {
  val result = LinkedList<Path>()
  val path = Path(initial)

  fun run(node: Node = initial): Unit =
      node.links.filter  { !it.visited }
    			.forEach { path.visit(it, if (it == target) {-> result add path.copy() }
                				          else              {-> run(it) })
             			 }
}
Gravatar image
id2046865
  • Репутация: 1
  • Сниппеты: 1
  • Ревизии: 0

Equilibrium index of an array is an index such that the sum of elements at lower indexes is equal to the sum of elements at higher indexes.

    public static int solution(int[] A) {
        long before = 0, after = 0, sum = 0;
        for (int i = 0; i < A.length; i++) {
            sum += A[i];
        }
        for (int i = 0; i < A.length; i++) {
            after = 0;
            before = 0;
            for (int j = 0; j < i; j++) {
                before += A[j];
            }
            after = sum - before - A[i];
            if (after == before) {
                return i;
            }
        }
        return -1;
    }